28 мая 2011 г.

Легализация, часть 2. Музыка

После длительного (месяца 3) рассмотрения различных альтернатив получения легальной музыки я остановил свой выбор на следующем наборе сервисов:

iTunes. Завел новый аккаунт без карточки, с адресом во Флориде. Пошел на сервис itunesgiftcard.com. Там было слишком много хороших отзывов о работе сервиса, подумалось, что все это липа. Несмотря на сомнения, я купил там для пробы карточку на 10$ и не зря. Через 2 минуты код был получен и введен в iTunes. Песни успешно и довольно быстро качаются, заливаются на iPod. Все просто и красиво. Стоят все теги, каверы. Качество 256 кбит/с - приемлемо для меня. После этих успешных проб экспортировал список всех песен в медиатеке в текстовый файл и стер к чертям все пиратское добро. Подчистую. Взял карточку покрупнее и пошел затариваться новой музыкой) Так началась новая глава в моей музыкальной жизни.

Juno Downloads, Beatport.  Тут все дороже, но много эксклюзива. Сюда буду ходить за самыми крутыми треками, которых не будет в iTunes (а таких, все-таки, не мало).

HousePlanet. Здесь регулярно выкладывают бесплатные миксы и промо-треки, из которых зачастую можно выбрать отличные работы. Большой респект этому сайту.

Яндекс.Музыка. Еще раз большое спасибо Яндексу за замечательный сервис. Им пользуюсь дома и слушаю все, что еще не купил (:

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

Так должно быть, за все надо платить. Я считаю это правильным и буду поступать в соответствии со своими убеждениями.

p.s. В третьей части буду убивать пиратское видео в своей жизни (правда не могу оценить насколько скоро это произойдет)

 

14 мая 2011 г.

Вскрытие retain/release, NSURL + unicode, NSTiffSplitter.

NSURL не любит Unicode
Выражается это тем, что при попытке инициализации NSURL строкой с кириллическими знаками:
NSURL *url = [NSURL URLWithString:@"http://server.com/dir/петя"]; возвращается nil. Xотя с адресами вроде "http://server.com/folder/peter" все проходит хорошо (обратное было бы весьма печально). Это ошибка самого NSURL, причем не только на iPhone, но и на Mac OS X. Проблему решает IFUnicodeURL - категория NSURL, написанная в IconFactory. Работает очень просто:

NSURL *url = [NSURL URLWithUnicodeString:@"http://server.com/dir/петя"];

Маленький совет с WWDC 2010
for (id key in dic) работает быстрее, чем for (NSString *key in dic), так как не выполняется операция приведения к типу. Вещь вполне очевидная, но может кто не задумывался.

Легкое вскрытие retain/release
Недавно отвечал на вопрос об утечке памяти при использовании строк, "впаянных" в код. К таким строкам можно обращаться как к объектам NSString*:

[@"string" substringToIndex:3];

При этом примечательно, что [@"str" retainCount] возвращает 2147483647 (NSIntegerMax). То же самое для [[@"str" release] retainCount]. Память под такие строки выделяется не в autorelease pool, а в constant pool, поэтому на них не действуют обычные правила с подсчетом ссылок. Тут же захотелось проверить:



Из всего этого извращения можно выделить некоторые особенности работы методов retain/release у NSObject:

  • Нет проверки на переполнение счетчика
  • Для retain нет проверки на значение retainCount (что вполне логично) 
  • У обоих методов есть проверка на то, где хранится объект - в autorelease pool / constant pool.
Все эти (немного веселые) глупости были сделаны из тех же стремлений заглянуть туда, куда простому смертному не заглянуть (возвращаясь к разговору об отсутствующих ложках).

NSTiffSplitter
На работе появилась потребность в просмотре многостраничных TIFF файлов на iOS девайсах (хотя это не мой проект (outsource), и поэтому это не мое дело). Стандартный же UIImageView позволяет просматривать только первые страницы. Также видел несколько вопросов на Stackoverflow, где люди интересовались библиотеками, позволяющими полностью просматривать такие файлы. В итоге сел на выходных и за часов 10 написал. Я редко спускаюсь на уровень общения с байтами, поэтому данный момент был для меня весьма необычен. В итоге - очень весело, полезно и интересно. Надо выбрать себе подобную цель покрупнее)
Когда выложу проект (проектик) на Github, расскажу в отдельном посте об интересных моментах , встретившихся при его написании.