пятница, 10 января 2014 г.

Думы о хакинтоше

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

Положительные моменты очевидны, цена железа по сравнению с оригинальными imac, mac mini и macbook отличается в разы. И разумеется последующий апгрейд, позволяющий собрать под себя мощную начинку. Отрицательная черта хака поддержка малого числа железа и устройств. Поэтому лучше воспользоваться рекомендациями по подбору железа на сайте www.tonymacx86.com Там представлены подборки компьютеров, инструкции по установке, утилиты и прочее что может понадобится.

Основная система на данный момент 10.7.5 и 10.8.5. Maverics (10.9.1) полностью работоспособен, но запуск осуществляется через флэшку. 

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

CPU: Intel Core i7-2600K, 3500 MHz (35 x 100)
Motherboard : Gigabyte GA-Z68X-UD3H-B3
RAM: 16368 MB (DDR3-1333 DDR3 SDRAM)
Video: Sapphire Radeon HD 6870
Audio: Realtek ALC889

Производительность в сравнении с оригинальными моделями маков (Geekbench Score)
                                                                    
                                                                          Single-Core Score      Multi-Core Score

iHackintosh     Intel Core i7-2600K                                         2978                       11875     
iMac (27-inch Mid 2011)    Intel Core i7-2600                        3736                       11776
MacBook Pro (15-inch Retina 2013)  Intel Core i7-3635QM     3159                        12227

В работе используется несколько тяжеловесных приложений: XCode, аналог фотошопа, браузер с большим количеством открытых закладок и "множество" прожорливых утилит. На собранном компьютере работать получается комфортно. Все это было бы прекрасно, если вам не нужно писать приложения для MAS. Вас ждет привязка аккаунта разработчика к устройствам разработки. Сабмит приложения и отладка специализированых фич потребует оригинального мака. Решение в таком случае иметь мак мини для публикации и финальной доводки приложения, а для комфортной работы использовать хакинтош с мощной начинкой.

Использовать хакинтош в работе каждый решает сам.


вторник, 5 марта 2013 г.

Распознавание капчи

Основной смысл "капчи" предложить пользователю такую задачу, которую с лёгкостью может решить человек, но которую несоизмеримо сложнее решить компьютеру(Wikipedia). Для пользователя это лишний ввод в поле, а для программиста интересная задачка.

При написание программы пришлось столкнуться с тем что все входы и заходы для сбора данных с определенного сервиса были сделаны через ввод капчи. Для начала попробовал разобраться с простенькой капчей. Разумеется ни каких явок и паролей не будет указано.

Пример капчи достаточно простой у которой процент распознавания где то около 99.99%.
Несколько тонкостей по поводу самой капчи.

Символы расположены на одном и том же месте, имеют одинаковый размер.









Алгоритм действия

+ переводим изображение в черно-белое.






+ применяем фильтр отсечения по гистограмме (отсечем яркие пиксели)

удачное отсечение
фильтр надо регулировать

+ символы имеют одну и ту же геометрию, то дальнейшие наши действия в создании базовых масок (маска обычный массив с высотой и размером максимального символа (9x13) элементов)









Позиции символов нам известны, маски для сравнения у нас имеются.

+ cравниваем каждый элемент из преобразованого изображения последовательно с масками (отношение колличества совпавших элементов к колличеству элементов в маске и будет та самая характеристика по которой мы оцениваем совпадение).

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

суббота, 19 января 2013 г.

Sandbox для mac приложений

Все хорошее когда то заканчивается...

При очередном обновлении приложения в MAS, было получено в отказе на публикацию. Требования для полноценных обновлений стали весьма просты, программа должна полностью работать в песочнице. Пройдет только апдейт с исправлением баги. Цели компании Apple полностью весьма прозаичны - контролировать инфраструктуру приложений сторонних разработчиков. Такие вещи как Gatekeeper и Sandbox помогают увеличить безопасность и надежность для конечных пользователей. Особенного накала разработчиков именно от такого введения в MAS нету. Изначально было ограничение на запуск программ в root mode. Поэтому в магазин валом пошли игры и утилиты казуального характера. Опыт в сфере мобильных технологий логично переходит в сторону десктопов.

Более или менее песочница нормально стала работать начиная с 10.7.3+. Появились интерфейсы для  сохранения и доступа к ранее открытым ресурсам (Security-Scoped Bookmarks). Этот механизм актуален для программ на подобии вьюверов файлов или редакторов. Если у вас программа представляет из себя игрушку или клиент в web-service, это не настолько актуально.

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

Работы с безопасными ссылками достаточно проста. Первое что надо понять, только пользователь может инициировать создание такой ссылки через диалог выбора файла, директории или с помощью drag&drop операции. Пользователь выбирает файл-директорию на жестком диске. Мы получаем ссылку на этот файл-директорию и по ней создаем некий объект, который мы в дальнейшем можем использовать без нужды последующего открытия диалогов. Разумеется все entitlements должны быть проставлены в настройках проекта.

com.apple.security.files.bookmarks.app-scope
com.apple.security.files.bookmarks.document-scope
com.apple.security.files.user-selected.read-write.
com.apple.security.files.user-selected.read-only

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

https://github.com/osx84/SandboxBookmark

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

понедельник, 19 ноября 2012 г.

Локализация MAC приложений

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

Начнем с того NSLocalizedString заработает, если добавить файл Localizable.strings в проект.
Дальше в коде NSLocalizedString(@"File", @""); вызываем и автоматом получаем строку из бандла нужного нам перевода от текущей локали. Никто не мешает создать свой файл строк и брать из него нужную строку с указанием таблицы.

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

#import <Cocoa/Cocoa.h>

int main(int argc, char *argv[])
{
 [[NSUserDefaults standardUserDefaults] setObject :
 [NSArray arrayWithObject:@"de"] forKey : @"AppleLanguages"]; 

return NSApplicationMain(argc, (const char **)argv);
}

Проверка программы под другой локалью. Первый способ, поменять локаль в настройках системы.
По умолчанию кодировка файлов со строками UTF-8. Рекомендации от Apple звучат так, если вы используете просто строки то нужно их хранить в UTF-16, а UTF-8 оставить для всех остальных случае.

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

Update 19.02.2013
Весьма любопытный факт выяснился в процессе локализации. Если у вас используется какой то дополнительный код или фреймворк с локализациями (например мы используем всем известны PFMoveApplication, в нем есть поддержка не одного десятка языков). При переключении на шведский язык для примера, который есть во внешних ресурсах, а в основном приложении его нету (у нас в прогремма есть английский и немецкие языки), использование макроса NSLocalizedStringFromTable(key, tablename, comment) будет не корректно. в таком случае выполнено.  В надписях будет использован перевод не английском языке, а поле key. Обязательно стоит посмотреть как программа ведет в разных локалях.

вторник, 11 сентября 2012 г.

ALssets iOS

"Invalid attempt to access ALAssetPrivate past the lifetime of its owning ALAssetsLibrary"
Время существования объектов библиотеки зависит от времени существования самой  библиотеки.  Всю работу с ассетами надо завершить до закрытия самой библиотеки.

Механизм ассетов призван скрыть слой работы с базой данных в которой хранится информация о пользовательских фотографиях или музыке. Проблемы возникают только в том случае если нужно получить пользовательские фотки (непоследовательность действий ведет к ошибкам в логе).  Логично что прежде чем выполнить какие то действия с базой, нужно ее открыть сделать запись или чтение, потом закрыть. 

вторник, 7 августа 2012 г.

Подготавливаем приложение для 10.8

Все что нужно сделать разработчикам, это правильно настроить работу с режимом HiDPI.

Если приложение активно использует OpenGL.

При инициализации вью к которому привязан 3D-context, делаем проверку ретины.

  1. #if (defined(MAC_OS_X_VERSION_10_7)) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7  
  2.         if ( [ NSApplication usingLionOSX ] )  
  3.         {  
  4.           NSRect baseBounds = [ self bounds ];  
  5.           NSRect hdpiBounds = [ self convertRectToBacking : baseBounds ];  
  6.            
  7.           if (NO == NSEqualSizes(baseBounds.size, hdpiBounds.size))  
  8.           {            
  9.               [ self setWantsBestResolutionOpenGLSurface : YES ];  
  10.           }  
  11.         }  
  12. #endif  

При изменении размеров приложения пересчитываем размеры.

  1. - (void) updateBounds  
  2. {  
  3.     NSRect  baseBounds  =   [ self bounds ];  
  4.       
  5. #if (defined(MAC_OS_X_VERSION_10_7)) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7  
  6.     if ( [ NSApplication usingLionOSX ] )  
  7.     {        
  8.         baseBounds      =   [ self convertRectToBacking : baseBounds ];  
  9.     }   
  10. #endif  
  11.   ....  
  12.    
  13.   glClearColor ( 0.0f, 0.0f, 0.0f, 1.0f );   
  14.   glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );   
  15.   glViewport (0.0f, 0.0f, baseBounds.size.width, baseBounds.size.height );  
  16.   ....  
  17.   
  18. }  

Про класс NSImage.

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

  1. NSImageRep* rep = [[img representations] objectAtIndex:0];    // fix HDPI  
  2. if (rep)  
  3. {  
  4.        NSSize size = NSMakeSize ([rep pixelsWide], [rep pixelsHigh]);  
  5.        [img setSize : size];  
  6. }  

Ресурсы и бонусы.

Все UI элементы представленные в виде растровых изображений, должны быть корректно увеличины в два раза. XCode автоматически их подхватит, достаточно добавить *texture.name*@2x.tiff  экземпляр вашей текстуры в проект. Если нужно вручную создавать растры из ресурсов то есть метод [NSimage imageNamed : @"*texture.name*"] корректно загрузит нужную картинку.

Разумеется не надо забывать про иконку, это полностью работа дизайнера отрисовка иконки в размере 1024x1024px.

Update 08.11.2012

В XCode 4.x появилась интересная фича по объединению изображений в разных разрешениях в один файл. Настройка называется Combine High Resolution Artwork. Ресурсы в (*.app) будут соединены в один файл (texture.png и texture@2x.png - будут соединены в файл texture.tiff). Это все работает начиная с 10.7.+. Если вам требуется что бы программа работала и на 10.6, то следует отключить эту настройку. 

Важное замечание по поводу ретины и поддержки под старые ОС. В XCode 4.4+ был выкинут за ненадобностью SDK под 10.6 osx. Сборка проекта с привлечением этого SDK (можно выпилить из более старых версий XCode), под 10.7.+ и 10.8.+ не даст проявится всем глюкам. Поэтому для проверки работоспособности стоит собирать проект именно в 10.6. и там же его тестить.

понедельник, 28 мая 2012 г.

Обзор русскоязычных изданий по программированию для Mac OS, iPad, iPhone.

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

Приведу краткий обзор литературы с небольшим описанием и краткими заметками.

Разработка приложений для iPhone, iPad и iPod touch с использованием iOS SDK
Автор: Дэйв Марк, Джек Наттинг, Джефф Ламарш
Переводчики И. Берштейн, Дмитрий Клюшин, Игорь Красиков, Н. Ручко


Издательство: Вильямс
ISBN 978-5-8459-1725-6, 978-1-43-023024-3; 2011 г.
Страниц 624 стр.
Переплет Твердый переплет

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

Минус данной книги, в том что повсеместно используется Xcode 4.0, а материал рассчитан для более старой версии. Хорошая новость что на сайте издательства есть информация о переиздании книги для iOS 5.0.

Разработка и продажа программ для iPhone и iPad
Автор: Дмитрий Елисеев
Издательство: БХВ-Петербург
ISBN 978-5-9775-0687-8; 2011 г.
Страниц 336 стр.
Переплет Мягкая обложка

Книги о разработке должны быть именно о ней, а не о чем то другом. Сто страниц о том как засабмитить программу в Apple Store, это перебор. В целом отвратное качество бумаги. Материал подан таким образом всего по немного из разных мест. Знаний особых не добавит.

Программируем для iPhone и iPad
Автор: Д. Пайлон, Т. Пайлон
Издательство: Питер 
ISBN 978-5-459-00375-8; 2012 г.


Страниц 624 стр.
Переплет Мягкая обложка

Книга-комикс. Манера изложения весьма интересна. Если покупать то стоит хотя бы для начала полистать. Единственная книга в которой уже есть XCode 4, но прошлая версия iOS.
Хорошая полиграфия. Книга оставляет приятное впечатление. Рекомендую для начинающих разработчиков.

Профессиональное программирование приложений для iPhone и iPad
Professional iPhone and iPad Application Development
Автор: Джин Баклин
ISBN 978-5-699-55828-5; 2012 г.
Страниц 672 стр.
Переплет Твердый переплет

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


Разработка приложений под iPhone. Полное руководство
Автор: Крейг Хоккенбери
Переводчик В. Порицкий
Издательство: Питер
ISBN 978-5-4237-0055-3, 978-0596809775; 2011 г.

Страниц 336 стр.
Переплет Мягкая обложка
Перевод откровенно говоря ужасен. Материал книги уже устарел. Не рекомендовал бы к покупке.

iPhone. Разработка приложений с открытым кодом
Автор: Джонатан Здзиарски
ISBN 978-5-9775-0397-6, 978-0-596-15519-3; 2009 г.
Страниц 368 стр.
Тираж 2000 экз.

Ужасная бумага и высокая цена для такой книги. Материал весьма любопытный. Рекомендовать особого смысла нету. Полистайте если будет интерес можно приобрести.


Objective-C 2.0 и программирование для Mac
Автор: Марк Далримпл, Скотт Кнастер
ISBN 978-5-8459-1607-5; 2010 г.
Страниц 320 стр.
Переплет Твердый переплет


Если нет опыта вообще в программировании. Эта книга даст некоторые ориентиры. Рекомендуется нубам в программировании. Хорошая полиграфия. ООП разжевано на основе Objective-C.

Книги в идеале лучше читать на английском. Переводов действительно нужных книг мало. Например ни одного издания по OpenGL ES. У издательства Addison-Wesley есть несколько книг по графике, так и весьма полезная книга Cocoa Design Patterns (обязательно к прочтению).


Update - Готовится к изданию книга


Разработка приложений для Mac OS X Lion
Майкл Приват, Роберт Уорнер.

Посмотрел вариант на английском языке. Весь материал построен в виде небольших зарисовок на тему как можно сделать ту или иную фишку UI для 10.7.

четверг, 26 апреля 2012 г.

Загрузка произвольного шрифта из файла средствами CoreText

В  Snow Leopard загрузка произвольного шрифта осуществлялась установкой его в системную папку всех шрифтов. В Lion такое решение deprecated. Тем более с приходом песочницы в 10.8 установка или попытка лезть в систему будет жестко подавлена. Решение в использовании Core Text API.

Последовательность действий File -> CGFontRef -> CTFontRef -> NSFont
Такая схема не работает в SL, разумно использовать старый функционал с заглушками.

Пример загрузки кастомного шрифта из бандла программы.
Для начала, добавим в проект ApplicationServices.framework (уже по умолчанию содержит ссылку на CoreText.framework).

  1. + (CTFontRef) fontFromBundle : (NSString*) fontName 
  2.                   withHeight : (CGFloat) height
  3. {  
  4.     //  
  5.     NSString* fontPath = [[NSBundle mainBundle] pathForResource : fontName 
  6.                                                          ofType : @"ttf" ];   
  7.     if (nil==fontPath)  
  8.         return NULL;  
  9.       
  10.     CGDataProviderRef dataProvider =
  11.     CGDataProviderCreateWithFilename ([fontPath UTF8String]);  
  12.     if (NULL==dataProvider)  
  13.         return NULL;  
  14.       
  15.     //   
  16.     CGFontRef fontRef = CGFontCreateWithDataProvider ( dataProvider );  
  17.     if (NULL == fontRef)  
  18.     {  
  19.         CGDataProviderRelease (dataProvider);   
  20.         return NULL;  
  21.     }      
  22.       
  23.     CTFontRef fontCore = CTFontCreateWithGraphicsFont (fontRef,height,NULL,NULL);  
  24.     CGDataProviderRelease (dataProvider);   
  25.     CGFontRelease (fontRef);  
  26.       
  27.     return fontCore;  
  28. }  

Как использовать в коде.

  1. CTFontRef bundleFont = [CustomFonts fontFromBundle : @"MavenPro-Regular"
  2.                                         withHeight : 25 ];  
  3. NSFont* font = (NSFont*)bundleFont;  
  4. ....  
  5. // use font in application  
  6. ....  
  7. CFRelease(bundleFont);  
  8.    

На заметку.
CoreText можно использовать для рендера сложного текста в UI. В фрэймворке реализована полноценная поддержка Unicode. Поэтому можно использовать прозрачно CTFontRef вместо CGFontRef  при рендере текста в Quartz 2D.

среда, 28 марта 2012 г.

Маркетинг, которого нет...

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

Выделим основной моменты 


Двигаем машинки...

Сайт. Блог. Персональня страница. Твитер. Фэйсбук. Такие знакомые слова. (с)

Любая ссылка на ваш продукт, пост, обзор, твит, конвертируется в пользователя. Разумно, везде оставлять свой след. Использовать принцип, чем громче крикнешь, тем больше услышат ! (с)

Бесплатные обзоры, с большой вероятностью поднимают волну интереса к вашему продукту.
Важно иметь контакт с блогерами, писать письма, давать промо коды, prerelease версии продуктов. Если вам предлагают платные программы продвижения, за 10 баксов мы напишем в нашем блоге статью или за 20 баксов мы твитнем 1 миллиону наших пользователям. Можете попробовать но эффекта будет ноль. Хорошее продвижение стоит не малых денег.

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

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

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

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

Локализация продукта, вопрос спорный нужна она ? Да. Определенно стоит попробовать. Французы и немцы терпеть не могут English. Японцы... Заниматься этим делом должен профессионал, а не онлайн переводчик.

Пишем коды...

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

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

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

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

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

Ох уж этот, Apple Mac Store...


Внятное описание функций программы. Понятные скриншоты. Красивая иконка.
Все в сумме дает положительный эффект. Важно понимать что MAS - это как витрина хорошего магазина, вопрос в том как завлечь пользователя, приобрести ваш продукт. Любая мелочь, например невнятное описание, странные скриншоты или нету доступа к сайту разработчика, могут влиять на пользователя.

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

Поддержка новой OS, важно комплексно добавить все фичи новой операционной системы в вашу программу до ее выпуска.

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

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

Скидки. Опытным путем было выведено, что они полезные. Дают небольшой процент к продажам. Небольшая скидка дает в результате большую прибыль, при сравнение с вариантом без скидки. Такой фактор имеет место быть. С чем это связано, пользователи любят покупать по скидками возможно.

Leitgedanke...
Важно постоянно создавать вокруг вашего продукта движение.

воскресенье, 22 января 2012 г.

Рендер в текстуру на основе opengl fbo

Разнообразие вендоров железа "обогатило" в прекрасном смысле этого слова рендеринг в текстуру. Какая только экзотика не была ( p-buffer ). На данный момент есть вменяемый вариант RTT через расширение EXT_framebuffer_object.  Вся идея данного расширения сводится к добавлению нового объекта FBO ( frame buffer object ). К этому объекту можно сделать привязку различных объектов, будь то буфер цвета, глубины, трафарет или RBO (renderbuffer object).

Приступим к написанию кода

Для начала проверяем поддержку данного расширения 

  1. - (BOOL) initFBO  
  2. {  
  3.     // check extension  
  4.     const GLubyte* extensions = glGetString ( GL_EXTENSIONS );  
  5.     if ( extensions )  
  6.     {     
  7.       if(gluCheckExtension((GLubyte*)("GL_EXT_framebuffer_object"), extensions))  
  8.         return YES;  
  9.     }  
  10.     return NO;  
  11. }  

Создаем текстуру в которую будем рендерить

  1. GLuint textureId      
  2. glGenTextures ( 1, &textureId );  
  3. glBindTexture ( GL_TEXTURE_2D, textureId );  
  4. glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );  
  5. glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );  
  6. glTexImage2D ( GL_TEXTURE_2D, 0, 4, TextureWidth, TextureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0 );  

Создаем FBO объект

  1. GLuint frameBufferId;  
  2.   
  3. glGenFramebuffersEXT ( 1, &frameBufferId ); // 0 - это главный буфер, очевидно что id > 0  
  4. glBindFramebufferEXT ( GL_FRAMEBUFFER_EXT, frameBufferId );  
  5. glFramebufferTexture2DEXT ( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,  
  6.  GL_TEXTURE_2D, textureId, 0 ); //привязываем тексту к фрэймбуфер  
  7.   
  8. // проверяем буфер ( код ниже )  
  9. // ...  
  10.   
  11. glBindFramebufferEXT ( GL_FRAMEBUFFER_EXT, 0 ); // восстанавливаем главный буфер  

Проверка буфера

  1. GLenum status = glCheckFramebufferStatusEXT ( GL_FRAMEBUFFER_EXT );  
  2. if ( status != GL_FRAMEBUFFER_COMPLETE_EXT )  
  3. {  
  4.     switch ( status )  
  5.     {  
  6.         case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:  
  7.             NSLog(@"FBO GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT");  
  8.             break;  
  9.         case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:  
  10.             NSLog(@"FBO GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT");  
  11.             break;  
  12.         case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:  
  13.             NSLog(@"FBO GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT");  
  14.             break;  
  15.         case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:  
  16.             NSLog(@"FBO GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT");  
  17.             break;  
  18.         case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:  
  19.             NSLog(@"FBO GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT");                            
  20.             break;  
  21.         case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:  
  22.             NSLog(@"FBO GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT");  
  23.             break;  
  24.         case GL_FRAMEBUFFER_UNSUPPORTED_EXT:  
  25.             NSLog(@"FBO GL_FRAMEBUFFER_UNSUPPORTED_EXT");  
  26.             break;  
  27.         default:  
  28.             NSLog(@"FBO Unknown error");  
  29.               
  30.             break;  
  31.     }  
  32.         
  33.     return NO;  
  34. }  

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

  1. glBindFramebufferEXT ( GL_FRAMEBUFFER_EXT, frameBufferId ); // выставляем нужный нам буфер  
  2.   
  3. glClearColor ( 0.0f, 0.0f, 1.0f, 1.0f );   
  4. glClear ( GL_COLOR_BUFFER_BIT );  
  5.   
  6. // что-то рисуем в текстуру ( корректируем все матрицы )
  7. // ...  
  8.   
  9. glBindFramebufferEXT ( GL_FRAMEBUFFER_EXT, 0 );      // восстанавливаем буфера окна  

Теперь у нас в текстуре которая была привязана к данному framebuffer объекту находится то что нам нужно. Можем с ней работать как с обычной текстурой. Отрисовать всю сцену в текстуру и применить эфффект блюра.  И конечно не забывайте удалять текстуры и буфера ;-)

Example OpenGL FBO (github) готовый пример показывает наглядно как с этим работать


воскресенье, 8 января 2012 г.

Забавный баг XCode 4.2

На данный момент xcode до той же visal studio далеко. Не факт, что это изменится в ближайшем будущем. Виной тому, весьма плохое отношение разработчиков к более плотному тестирование IDE. В четверке сделали приятное разработчикам разрешили иметь некий аналог солюшенов. Но есть одна фича которой приятно пользоваться, потому как она автоматизирует процесс привязки gui контролов с кодом (actions & properties).

Взглянем на солюшен с двуми проектами один из которых вложенный.
Добавим для формы из второго проекта кнопку. Проведем связь из IB в код для создания @property-кнопки ( не так важно свойство или метод ).


Теперь посмотрим чего же там в итоге то получается. О! В хедер корректно добавлось свойство-кнопка. Но где же описание ? Увы оно в другой проект прописалось.


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

воскресенье, 1 января 2012 г.

Железяка Amazon Kindle Touch

Прогресс не стоит на месте. Цены падают, устройства становятся более доступныеми для простых смертных. Первая книга с тачем от амазона. Психологический барьер в 100 баксов преодолен ( мне по такой цене удалось заполучить перед НГ девайс, увы c рекламой правда ). Несоменно сравнивать с другими аналогими смысла нету. C тем же Nook, где после некоторых усилий читалку можно превратить в псевдо планшет на электронной бумаге с полноценным андройдом на борту. Но это все лирика. Вернемся к киндлу четвертого поколения.

В общих чертах плюсы

+ сенсорный экран ( это удобно после ipad, iphone и прочих устройств подобной тематики )
+ перелистывание теперь более шустрое ( если сравнивать с третьим поколением )
+ заметки
+ качественная сборка ( ничего не хрустит, не скользит приятный на ощупь пластик )
+ цена ( вы получаете то что вам нужно без всяких не нужных наворотов )

 В числе минусов хотелось бы отметить

- пока сырая прошивка ( мало настроек, поворачивать экран нельзя )
- прощаю что нету поддержки fb2, но где поддержка epub ????
- официально киндл в нашей стране не продается, поэтому ощутить все прелести от платного  контента не получится

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


Update (30.06.2012) 
Обновил прошивку на девайсе до 5.1.0.
Тяжелые книжки стали открываться без подглючивания устройства. Интерфейс стал более отзывчив. Был глюк на 5.0.0 если много закинуть книгу на устройство с устройством происходило странное, переодическое подвисание. После обновление залил более 50 книг большого размера, устройство открывает книги без проблем. Из дополнительных плюсов добавился Landscape Mode, дополнительные настройки форматирование вывода текста (больше текста на экране), поддержка защищенных WI-FI сетей. Добавили кучу локализаций, но увы русского языка нету, видимо его вообще не будет. Кому надо скачают поделки народных умельцев.

Kindle Touch Software Update Version 5.1.0

В итоге имеем более стабильную работу устройства.  Перед прошивкой весь контент лучше удалить.