Swift Publisher - мой первый проект в BeLight

0 коммент. | добавить комментарий
Моя работа в Билайте началась 9 марта 2005 года. К тому моменту, как я попал в эту компанию, она имела два продающихся продукта. Первый - Business Card Composer - программа для создания и печати визитных карточек, и второй - Mail Factory - программа для создания почтовых наклеек, печати конвертов и прочей лабуды. Что касается Mail Factory - суть этой программы для меня до сих пор не ясна, она очень сложна, наворочена, и продается плохо. А вот работа с Business Card Composer в то время представляла из себя примерно следующее: в вашем распоряжении имелся холст размером с визитку, на котором можно было размещать картинки, прямоугольники, линии, и текст. Кроме того, можно было вставлять элементы из Address Book. Полученную визитку можно было напечатать на визиточной бумаге.

Компания в то время получала много отзывов от пользователей на тему того, что они используют BCC не по назначению, а для создания бланков деловых писем путем установки размеров холста в стандартный A4/Letter, и последующей распечатки. В связи с этим было решено меня, как нового сотрудника, бросить на создание специализированной программы для печати бланков и деловых писем. Соответственно, рабочее название нового проекта было "Letterhead", а я занялся тем, что стал переносить в него классы из BCC.

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

Потом я грохнул интеграцию с Address Book.

Еще потом мы решили, а я принялся разрабатывать новый инструмент - Extended Text. Суть задания сводилась к тому, что хорошо бы иметь набор текстовых боксов, чтобы текст, размещенный в них, умел "перетекать" из одного в другой - это было бы удобно, например, для организации многоколоночных писем. Проектирование, реализация и борьба с багами отняли около месяца. После завершения этой работы я познакомил дизайнера нашей компании с тем, что получилось, после чего он стал требовать добавления новой функциональности, а именно - обтекания текстом других объектов (картинок, фигур, и пр.). Это, по его утверждению, придало бы письмам больше выразительности и красоты.

Реализация обтекания отняла еще месяц, после чего всем стало ясно, что городить такие сложности ради создания дурацких бланков - дело неблагодарное, и менеджмент решил, что программа будет предназначена для Desktop Publishing.

Дальше были бесконечные просмотры Apple Pages, Adobe InDesign и иже с ними, тыренье их функциональности, нудная работа над пользовательским интерфейсом, отладка, отладка, и отладка. Полученный продукт назвали Swift Publisher и выпустили в конце июля 2005 г с ценой $35 за download-, и $40 - за CD-версию.

Итого: проект не имел никакого плана, вся разработка велась исключительно на основе первоначального видения, оперативных событий и анализа рынка. Работа над проектом заняла 5 месяцев, 3 из которых я работал один, а потом ко мне подключились еще два разработчика. Продукт тогда по популярности полностью затмил и BCC, и MF. Это был успех. Хотя мы и породили прямого конкурента Apple Pages (Apple даже впоследствии отказалась от размещения Swift Publisher в Apple Store), наш выигрыш был в цене (Pages продавался только в комплекте с Keynote за $80) и в простоте пользовательского интерфейса. Кстати, вышедший позже Pages 2.0 ушел от настольного издательства в сторону текстового процессора - туда ему и дорога.

Ах да, торт, который мы съели в день релиза, был очень вкусным :)

Pod-pod-pod

0 коммент. | добавить комментарий
Вчера, 12 сентября, Стив Джобс на специальной презентации Apple продемонстрировал обновленную линейку плееров iPod. В глаза бросилось то, что новая прошивка плееров iPod video и iPod nano позволяет (наконец) играть в игры и (о, ужас!) запускать ПО сторонних производителей.

- Сережа, к чему ты клонишь?
- К тому, что теперь под iPod, а точнее - под ОС Apple для iPod можно писать софт.

Мак-девелоперы, ряды которых я покину через три дня, скоро начнут медитировать на фреймворки с названиями вроде iPodApplicationKit и CoreIPod. Я как будто вижу перед собой оглавление следующего ADC Reference с классами NSiPodPlaylist, NSiPodSettings, NSiPodControl, и т.д.


iPod is Not a Black Box Anymore!


Так совпало, что именно сегодня я снес прошивку Rockbox с моего iPod nano (теперь уже предыдущего поколения) и вернулся на оригинальный firmware Apple.

Эксперименты на живом iPod nano я начал сразу, как только узнал, что его родная прошивка Apple имеет настоящий bootloader и умеет обращаться с файловой системой - а значит, может именоваться Операционной Системой. Для такого популярного гаджета просто не может не быть альтернативных ОС - решил я, и оказался прав.

К установке нарытого мной в Интернете iPodLinux я подошел серьезно. Вначале я долго читал форумы, на которых американские ай-подо-воды жаловались друг другу на неудачи с установкой данной ОС на свои гаджеты, в результате чего последние переставали работать, а предпоследние шли в магазин за новыми гаджетами. Однако, экспериментатор победил скептика, в результате чего я целую неделю играл в iDoom, запускал редактор vi, медитировал на bash и неимоверно пёрся.

Спустя неделю я вернулся к родной прошивке. Следующим экспериментом была установка прошивки Rockbox, которую мне очень рекомендовал друг Женя. Rockbox продержался на моем iPod целый месяц, поскольку в комплекте с ним я нашел целую кучу игрушек, которые доставили мне много приятных минут.

Почему я снова вернулся к родной прошивке? Потому, что в проигрывании музыки ей нет равных. Также ей нет равных по удобству интерфейса. iPodLinux, конечно, имеет mp3-плеер, но у меня он иногда зависал, и, к тому же, я так и не смог добиться от него поддержки Unicode в ID-тегах. Rockbox в этом отношении вел себя несравненно лучше, но, признаться, я так и не смог привыкнуть к его интерфейсу. Может быть, на всяких там iRiver прошивка Rockbox рулит, но...

Не знаю, в общем. Кто-то из зала кричит, что, мол, iTunes - suxxx! Я раньше тоже так думал. Однако, распробовав хорошенько связку iTunes + iPod, на самом деле уже не хочется ничего другого. Да, идея копировать музыку на плеер просто в виде файлов и директорий звучит заманчиво, но надо ли мне оно?




Почему тогда я устанавливал iPodLinux, Rockbox? Более того - почему я собираюсь пробовать новые прошивки, как только таковые будут появляться? И еще более того - почему я советую всем ай-подовцам и ай-подовкам делать как я? Да потому, что это чертовски занятно! Я с нежностью смотрю на маленький экранчик моего гаджета, на котором (ни хрена себе!) я селил целых две ОС, для которого я компилировал ядро linux, в котором я создавал новые разделы на диске... Мне кажется - это сравнимо с чувствами маленького ребенка, который в который раз разбирает новую, только что подаренную ему машинку, чтобы посмотреть, что там у нее внутри.

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

Deadlock и военкомат

0 коммент. | добавить комментарий
Был сегодня в райвоенкомате - пришел становиться на учет офицеров запаса. Тетенька там сидит такая смешнючая - и говорит мне: "А отчего же ты, Сережа, раньше не явился? Приказ-то о присвоении тебе звания уже два месяца как пришел. Это называется "несвоевременная явка" - будем штраф оформлять".

А я ей: "А не пришел я потому, что не знал, что приказ уже есть - мне же не приходила повестка!".

А она мне: "А повестку я тебе не прислала, потому что ты ко мне не пришел, и я не могла завести твою карточку и вписать в нее твой адрес".

А я ей: "А не пришел я потому..." - ну и так несколько раз, по кругу.

Типичный deadlock, когда один поток (я) хочет обратиться к ресурсу (в военкомат), но не получает положительного значения семафора (повестку), а второй поток (военкомат) тоже хочет обратиться к ресурсу (ко мне), и тоже у него нет семафора (моего прихода). И некому эти семафоры взвести.

(В этом месте я два часа философствую о том, что взаимные блокировки - суть явление природы, и могут они встречаться везде, а не только при параллельном программировании. Вот ведь как оно все устроено заковыристо! :)

О переходе на новую работу

0 коммент. | добавить комментарий
А вот снился мне давеча сон про самое ужасное собеседование в мире.

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

А потом, гад, добавляет: "Ну, мне надо притащить из подвала комп - вот, мол, сходи-притащи, и тогда, так уж и быть, я тебя не выгоню". Я, ясен перец, взвиваюсь на дыбы, выдаю ему, что мне не нравятся его методы и что в рот я ебал эту контору мне не хочется работать в компании, где так относятся к будущим сотрудникам. Встаю и гордо ухожу. Проснулся.

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

Одно слово - не назрело!

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

Как же меня сейчас выкручивает всего! Что случится завтра - ума не приложу... И вот ведь какая штука - никто за меня ничего не сможет решить!

Что-то будет?..

О Лукаше Подольски и об одной проблеме роста

0 коммент. | добавить комментарий
С момента моего рождения и до определенного золотого возраста я ощущал себя самым маленьким, самым-самым крошечным во Вселенной. Даже ровесники казались мне тогда намного больше, старше и опытнее. "Вот вырасту", - говорил себе я - "и буду кем только захочу". Космонавтом не хотелось, а вот каким-нибудь спортсменом, капитаном, директором заводов-газет-пароходов, или даже врачом - это запросто. В то время, если в моем кругу и появлялся кто-то еще младше меня, я таких просто не замечал по причине их крайней незначительности (если уж я сам - крошечный, то они тогда - какие?) Старшие же из моего окружения зачастую казались мне неудачниками (уж я-то, когда вырасту, буду гораздо круче, чем они). "Все у тебя еще впереди", - говорил я себе.

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




Может, это случилось тогда, когда мой хороший знакомый и ровесник женился и завел ребенка, а я еще продолжал блядовать, не помышляя о продолжении рода?Или когда одноклассник - вечный конкурент - показал мне свое первое творение на Си, в то время как я еще только разгребался с Паскалем?Или когда бывший одногруппник и одногодка вдруг оказался моим начальником?


Я не знаю. Знаю только, что вчера, когда я смотрел матч Германия-Португалия за 3 место ЧМ-2006, я опять почувствовал это. Ну, Лукаш Подольски, ну как же так?! Ты - и по телевизору, и пасы, и по воротам, и комментатор в восторге, и Мондиаль, и поклонницы, и деньги, и слава, и гимн. А я - на диване, и пиво, и духота, и мухи, и Жигули, и эта сука прожужжала все уши!

А, между прочим, я старше тебя на целый год.

Разэдак тебя и разтак, Лукаш Подольски!

Вести с поисковых полей

0 коммент. | добавить комментарий
В Mac OS 10.4, среди прочих новшеств, была внедрена технология поиска Spotlight, включающая индексирование и поиск по именам файлов, а также индексирование и поиск по метаданным. Для меня это значит примерно следующее: поскольку наш проект использует свой формат документов, представляя их в виде Mac OS bundles (т.е. документ представляет собой папку, в которой содержится описание структуры документа, а также хранятся использованные текстуры, материалы, 3D-объекты, представления и пр.), то автоматически Spotlight'овый поиск по нашим документам работать не будет. Чтобы справиться с этой проблемой, мне вчера довелось написать плагин для системы Spotlight - т.н. Spotlight Importer, который предоставляет данной системе метаданные наших документов в требуемом ей формате.

Об этом и речь. Для быстрого поиска информации в системе можно, как Microsoft, долго разрабатывать WinFS, и впоследствии отказаться от внедрения ее в новой версии Windows, а можно придумать Spotlight, поддержать поиск по стандартным форматам данных, и обязать разработчиков писать плагины для поиска по нестандартным форматам. Отличие в том, что второй подход уже реально работает на протяжении более чем полугода, а первый - нет, и неизвестно, когда WinFS будет-таки выпущена в свободное плавание.

Итак, Spotlight Importer. Его разработка сводится к реализации функции Boolean GetMetadataForFile(void* thisInterface, CFMutableDictionaryRef attributes, CFStringRef contentTypeUTI, CFStringRef pathToFile), которая принимает имя документа, созданного в нашем приложении, а возвращает ссылку на словарь метаданных attributes. Очевидно, что данная функция должна открыть документ, прочитать из него то, что может быть проиндексировано, и запихнуть это все в словарь attributes. Я уложился в набор стандартных ключей, используя:

  • kMDItemTitle - имя документа
  • kMDItemAuthors - массив, состоящий из имен авторов документа (у наших документов м.б. только 1 автор)
  • kMDItemDescription - описание документа

Нет, ну ведь правда здорово? Немедленно создаем документ spiralka и заполняем поля автор/копирайт/описание (кому не видно - имя автора "Zaycheg"):



Итак, что мы теперь найдем в Spotlight по запросу "zaycheg"? Конечно же, документ spiralka:



Не просто, а очень просто! Напоследок самое вкусное: как связать разработанный плагин с форматом документов. Иными словами - как сказать Spotlight'у, что для индексирования наших документов необходимо запустить наш плагин. Для этого в файл Info.plist приложения (содержит метаданные о приложении) необходимо указать тип (расширение) наших документов в формате UTI (Uniform Type Identifier). После первого запуска приложения Mac OS проанализирует его файл Info.plist, а затем всегда будет искать плагин для индексирования данного UTI в bundle приложения, и в системных папках Library. А плагин декларирует множество поддерживаемых UTI, и имеет собственный GUID, что гарантирует его уникальность в системе.

Ну красота ведь! До сих пор не нарадуюсь :)
А Microsoft пускай еще WinFS попишет.

О важности выполнения плана проекта

2 коммент. | добавить комментарий
План программного проекта - это:

  • чертовски
  • важная
  • штука.

Говоря об этом, я имею в виду следующее. Если план проекта изначально не составляется, и разработка ведется исключительно на основе некоторого видения (зафиксированного документально или устно), а также оперативных (текущих) рассуждений/собраний, то на самом деле к менеджменту не может быть никаких претензий, поскольку его нет. Ведь нельзя преъявлять претензии к тому, чего в действительности не существует? По-моему, так.

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

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

Ведь если не вести проект в соответствии с планом - то зачем тогда было гнуть пальцы и составлять план?

Подведем итоги:
1. Добейся утверждения заказчиком своего плана
(Если ты не можешь этого сделать, то ты нихера не стоишь как менеджер)
2. Умей отстоять утвержденный план.
(Если ты не можешь этого сделать, то ты нихера не стоишь как менеджер)
3. Добейся от команды выполнения плана.
(Если ты не можешь этого сделать, то ты нихера не стоишь как менеджер)
4. Если ты, менеджер проекта, не выполняешь свой план, то лучше убей себя сам.

Черт, и как же сильно воняет максимализмом от всего этого! Но, возможно, так до тебя четче дойдут мои мысли о том, почему и насколько в действительности важно выполнение планов? И тогда мы, нашими совместными усилиями, сможем сделать этот мир еще чуточку лучше :)