воскресенье, 27 сентября 2009 г.

Девелоперский отдых. Йога

После сокрушительной неудачи в предыдущей попытке отдыха от бесконечного девелопмента руки все же не опустились, и поиски решений были продолжены. Решено было попробовать обратиться к традиционной йоге, но в наших, возможно, несколько не столь традиционных реалиях. Сегодня первая часть фотоотчета о новейшей методе: “Развиваем йогу”.

image001

image002

image003 

image007

image008

Приятного и оздоровительного воскресного отдыха, коллеги!
Материалы для самостоятельной работы см. здесь.

PS: есть самое искреннее желание поблагодарить всех высказавшихся в  “Ограничениях триальной версии”! Вот теперь точно понятно, зачем нужен блог: пока сочинишь пост, сам сто раз все “образмышляешь” да передумаешь. А почитав комментарии, мысль дотачивается уже до почти наброска кода. Получилось, что от подсчета запусков или expired date никуда не деться. Да пришлось поколдовать с самописным с нуля notification в трее. Отчет о том, что получилось, будет позже. Народ, С_П_А_С_И_Б_О за комменты!

Ну, а о летних видах активного отдыха поговорим поближе к лету.

вторник, 22 сентября 2009 г.

ZIP-архивы. Просто и элегантно

На CodeProject.com появилась новая статья о работе с ZIP-архивами “Zip Utils - clean, elegant, simple, C++/Win32”.

Вполне элегантный код. Другие библиотеки для работы с ZIP-архивами уж больно навороченные: то разные методы сжатия, то завязка на MFC вроде CZipArchive. Но это все не то! Как правило, сжимать файлы приходится стандартными архиваторами вроде того же самого WinZIP. Ну, не буду же я выкладывать на сайт дистрибутивы в ZIP-подобном формате, но все же несколько ином!?! Как пользователь его распакует? Поэтому, зачастую, задача сводится всего лишь к распаковке стандартного ZIP-архива.

Вот что-то подобное давно и искалось. Чтобы код был прост в использовании, чтобы всегда поддерживал самый обыкновенный ZIP, чтобы не было зависимостей от сторонних DLL. Ну и чтобы, весьма желательно, не довешивал в бинарник и еще полторы сотни килобайт – больно это жирно будет для банальной распаковки ZIP`а!

Короче, скачал. Попробовал. Набросал за пяток минут пару тестов на MFC  (весь код занял с десяток строк). Полный зер гут! Работает отменно: просмотр архива, поддержка паролей, распаковка. То, что надо! Весь бинарник в Release-версии весит всего лишь 23 кило (VC6) – впечатляет!

PS: осталось только придумать, куда это прикрутить. В Aml Pages что ли!?! Дык вроде как ни к чему? Там как раз и есть свой собственный, самописный, ZIP`о-подобный алгоритм… Работает как часы.

среда, 16 сентября 2009 г.

Ограничения триальной версии

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

Вот как раз на ограничениях и начался “чудный секос”. Ёптыдь, кто бы мог подумать, что ограничения это так сложно!?! Однако-ж!

Ищем же золотую середину!?! Мало ограничений – никто не будет платить; много ограничений – никто толком не распробует блюдо, и снова платить не будут!

Похоже, компромисс это искусство.
Что там у нас обычно: ограничения по сроку использования, ограничения по функционалу, да нагскрин нам в руки.   Замешиваем все три ингредиента, соли-перца по вкусу и “блюдо” пользователю на стол.

Ага. Щаз!!! Здесь случай особый! Добрую половину этих приправ некуда солить, а с оставшимися двумя с половиной приемами не пойми что делать… Короче, у данной шароварки есть некоторые нюансы. Огласим весь список, пожалста!

  • Предназначение софтины в кастомизации сторонних приложений. Это означает, что никакого постоянного окна у нее нет. Сидит себе софтина в трее, да наводит определенный “порядок” в рядом работающих приложениях.
  • Программа не работает с данными. То бишь все пользовательские данные это ее собственные настройки. И ничего более.
  • Программа портабельная – соответственно может, а частенько и работает с флешки.
  • В подавляющем большинстве случаев программа стартует из автозапуска.

Отсюда вытекают довольно нетривиальные последствия.

  • Ограничение функционала: крайне не хочется делать, т.к. софт только-только начинает развиваться, и пока особо ограничивать нечего. Все супер-пупер навороты запланированы на следующие версии.
  • Ограничение данных: нечто вроде объема документа, запрет печати, водяные знаки. Нечего ограничивать! Потому как нет никаких пользовательских данных, документов и.т.д.
  • Ограничение по времени использования: нельзя, потому как… да ловится это на раз-два-три. Да и программа портабельная – куда запуски (время) писать, если она с флешки работает!?!
  • Нагскрин (nagscreen) при старте: нельзя, т.к. в 99 из 100 случаев программа стартует вместе с Windows… Ага, блин! Вот только нагскрина при запуске Винды не хватало!
  • Нагскрин на выходе: тоже не годится. Т.к. в 99 из 100 завершаться программа будет опять-таки вместе с самой Windows.
    Лочить выход из Винды да закрытия нагскрина ручками это вообще не дело!
    А повисеть нагскрину пару-тройку сек да и закрыться… А где смысл? Ну закроется всё на пару-тройку сек позже, какой же это нагскрин!?!
  • Нагскрин по ходу работы: опять двадцать пять! Не прокатывает! Почему – опишу ниже.

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

Поэтому с нагскрином посреди работы возникает примерно следующая ситуация. Пользователь сосредоточенно работает в каком-то стороннем приложении, и вдруг у-у-упс, возникает нагскрин… Возникает он настолько неожиданно, настолько стремительно, что просто хочется сказать “ух-ты, ёпты!”. При этом, конечно же, пользователь сбит с толку. Работает себе в каком-нибудь, ну скажем, Word`е, пишет себе понимаешь текст для блога, размышляет, придумывает, в общем, с головой погружен в свою же собственную задачу. А тут фигакс, и в центре экрана появляется какая-то фигня, перекрывает его же любимый Word, и давай себе считать секунды.

Это настолько отвлекает, настолько раздражает, что просто слов нету.
Не голословно утверждаю! Сам уже перебрался на триальную версию, и вовсю гоняю этот нагскрин. Если даже мне – автору – от этого нагскрина настолько нехорошо, что проще и быстрее нажать “Выход из приложения”, чем ждать несколько секунд пока станет доступной кнопка “Продолжить”.
Потому что нагскрин отвлек крайне неожиданно, заставил что разве не вздрогнуть. И к тому же заставляет ждать пару-тройку секунд, пока можно будет вернуться к основной задаче. А между прочим в этот момент я – я
! ни Пушкин, ни Билли, ни соседка – а я_дорогой_любимый_бесконечно_милый – в эти самые драгоценные секунды теряю сфокусированность на своей собственной задаче, теряю нить размышлений, контекст своей работы. Вот потому и проще кликнуть на кнопке “Выход”. А после кликов так десяти-двадцати вообще снести софтину нафиг!

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

Остается только нагскрин. Только вот загвоздка: вариантов его показа совсем немного – это не старт, и не завершение софтины. А нагскрин по ходу работы в таком виде стимулирует вовсе не покупку, но русский мат да скорый снос проги.

И куды крестьянину податься – ума не приложу!?! Коллеги! Что делать? (“Кто виноват” уж не спрашиваю – в курсе :)

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

понедельник, 14 сентября 2009 г.

Поддержка разворачивающихся постов!?!

Хм… действительно что-ли появилась поддержка разворачивающихся постов в Blogger?

А где же Балмер? (попытка №3)

Примечание к попытке номер 2: что ж, несмотря на происки копирайтеров, которые буквально за день прибили ролик на YouTube, потерянный ролик был вновь разыскан на просторах сети.
Хех, Microsoft банит рекламные ролики Windows 7, а они вновь находятся с помощью Гугла, на том же YouTube (между прочим, сервис Гугла) да причем еще посредством браузера Chrome (между прочим, разработка Google)…Экое однако возникло противостояние гигантов из Редмонда и Маунтин-Вью!?! :)
Попробуем выложить еще разок!

Microsoft начала пиарить Windows 7. Понравился один из ролов… Хотя сдается мне, вся фишка не в картинке, а в саундтреке, действительно симпотный! Все мы – аудиалы или визуалы или еще как

Заколебали удалять ролик - попробуем выложить здесь

Но вот вопрос, а где же Балмер? Что-то тут не так, ребяты…
PS: Если ролик опять забанят, стучите в камменты – на этот раз ролик уже слит на хард.

четверг, 3 сентября 2009 г.

Потерявшийся клиент

В одном из прошлых постов шла речь о возможных способах выхода из…тьфу ты, входа!!! в “рабочее”, активное состояние. И между прочим, был забыт такой замечательнейший способ как бабло. А ведь бабло побеждает зло! Что может лучше стимулировать к работе (или уж почиванию на лаврах, но без мук совести) как не накапавшая за время отсутствия девелопера юзерская денежка!?!

В общем, сажусь намедни после выходных разгребать накопившееся наше всё – саппорт, форум, RSS, почту и.т.д. И – о радость – The Bat вынимая “мыло из мыльницы” радостно “зааплодировал”. То бишь, проиграл мелодию, обнаружив, что в почту свалились очередные ордера. Кстати, говоря, удобная штука в Бате: настраиваем признак(и) письма, и Бат при получении такого письма проигрывает указанную мелодию, заливая нас трелями и положительными эмоциями.

Ну, да ладно. Долго ли коротко, ключи отправляются к новым юзерам. Обязательства выполнены. Мани на месте, жизнь прекрасна. Отправляюсь разгребать форум от моих не в меру настырных тестеров (хотя, быть может, их настырность это манна небесная…). Все идет свои чередом, состояние “потока” достигнуто в считанные часы, разработка несется ни по дням, а по часам. Релиз приближается со скоростью урагана Химена.

И вдруг, от клиента, которому ключи отправлены еще позавчера, сваливается мыло: что мол могли бы ему хотя бы и ответить на письмо с его ордером… У-у-упс! Похоже эти самые ключи он позавчера так и не получил. А клиент – директор отдела одного Интернет-магазина, в средних видимо годах, и вообще весьма спокойный и рассудительный, если уже 5-ый день сидит без регистрационного ключа и не “рычит”. Короче, лакомый это клиент. Ценю я таких: знают чего хотят, умеют облекать свои мысли в понятные слова, нужны еще лицензии – купят. В общем, мечта, а не клиент.

Буквально через минуту мылом переспрашиваю его, получал ли он позавчера ключи? Ни ответа, ни привета. А мыло на домене этого же магазина, так что на кривой сервер грешить не приходится. Проходит полчаса – снова тереблю его мылом. Реакции ноль. Может антиспам так чудно у них в магазине настроен? Окей! Валю в этот магазин, нахожу мыло веб-мастера, и пишу письмо ему с указанием полных ФИО и должности клиента, объясняю ситуацию… Опять все то же, все так же. Ноль ответа. Ну ладно – “быват”. Слава яйцам богу оплата шла через электронные деньги, причем прямиком со счета. Захожу в е-мани, разыскиваю платеж, выуживаю из него личный email клиента, пишу по нему. Полдня прошло… Полет нормальный. Ни ответа, ни привета. А клиент-то годный!?! Да и не привык я вовсе, чтобы у меня клиенты пролетали.

Вот вам бабушка и День Знаний :(. Знания есть – известно многое: магазин, мыло клиента на сервере магазина, мыло веб-мастера магазина, ФИО и должность клиента, а толку с этих знаний? Две консервные банки, и дырка от баранки! Что делать, чего б предпринять – непонятно! Разве что вроде как телефон в отдел магазина еще есть. И что? Похоже придется теперь звонить? Вариант “ну его нафиг” даже и не рассматривается, но чтобы я сам звонил клиенту, это уже что-то новенькое…

среда, 2 сентября 2009 г.

Гиперссылки в RichEdit

Наконец-то Microsoft официально “раскололась” об особенностях автоматической подсветки гиперссылок в RichEdit. И-э-эх, этот бы код “да богу в уши” да пару-тройку лет назад бы…

Если внимательно почитать статью, легко убедиться, что все навороты вроде подсветки адресов email без префикса mailto, тултипы к гиперссылкам поддерживаются версией RichEdit 5.0 или выше. Коего даже в Windows XP SP3 днем с огнем не сыщешь. Всё это, конечно, очень здорово. Но есть некоторые “но”. Например, когда RichEdit четвертой версии “светит” ссылки сам – автоматически, то он где ни попадя распихивает угловые скобки. Приятный такой сюрприз, которого во всех предыдущих версиях не было. Так что, если используется механизм собственных гиперссылок с использованием угловых скобок – весь ваш код поплывет напрочь.

Но это еще полбеды. По ходу автоматической подсветки RichEdit без конца генерит нотификацию EN_CHANGE – изменение текста (если установлена маска ENM_CHANGE). Тоже особенность с последствиями. Кладете текст в RichEdit, просите подсветить ссылочки и у-у-у-упс, весь текст вдруг преображается, и тут же помечается как имеющий несохраненные изменения.

Ох, и накушался я отладки пару-тройку лет назад, пока разбирался с этими незначительными “тонкостями” RichEdit 4.x. Представьте какая красота: открыл документ, посмотрел на текст, закрываю – а он просит сохранить изменения!?! Ух и немало было ночей потрачено на выяснение “какая сволочь стреляла”.

В конце концов, положил я с прибором на автоматическую подсветку и написал собственный алгоритм парсинга гиперссылок, безо всякой мути вроде изменения текста и словно по волшебству появляющихся везде подряд угловых скобок. Ну, а уж свой тултип прикрутить к этим гиперссылкам задачка совсем уж несложная. Хотя стоит отметить, что теперешние microsoft`овские тултипы всплывают даже и на моих “ручных” гиперссылках :).

Тултипы поддерживаются в RichEdit 5.0 и старше, и включаются так:

//добавим определения, если их нет в старых header`ах
#ifndef SES_HYPERLINKTOOLTIPS

   enum {SES_HYPERLINKTOOLTIPS=8};
#endif
#ifndef EM_SETEDITSTYLE

   enum {EM_SETEDITSTYLE=(WM_USER + 204)};
#endif
SendMessage(hwndRichEdit,EM_SETEDITSTYLE,
    SES_HYPERLINKTOOLTIPS,SES_HYPERLINKTOOLTIPS);

Что ж, посмотрим, что Microsoft преподнесет в аспекте совместимости RichEdit на этот раз…