Tags: programming

code

Программирование как алхимия и немного о серебрянной пуле

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

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

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

Постепено наклепали библиотек, функций, все вроде стало более-менее рутинно - сиди и складывай кубики. Потом - бац! И вышли на новую ступень - языки высокого уровня. Одну строчку написал - и словно по волшебству оно опять работает. Там где раньше надо было писать тонны кода.

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

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

И снова переходим на новый уровень. А что если UI описывать не кодом, а разметкой? А что, если программа станет сайтом в интернете? Пару строчек - бац! И форма готова. Еще пару строчек - и еще одна страница готова. Снова поднимается волна энтузиазма и популятрности.

Затем снова упираемся в серверную часть... А что если сделать поддержку БД на уровне языка? А что если генерировать шаблон программы с правильными паттернами прямо из IDE?

Новая школа пишет "rails new myapp" и получает волшебство. Результат, который раньше усердно писали монахи в кельях на протяжении человеко-дней, или копировали из проекта в проект по заветам мудрых старейшин (которые мало кто понимал и помнил откуда они взялись).

Web-UI для телефонов и ПК, модули для общения программ друг с другом, генераторы приложений... Старые знания бесполезны, встречайте новых Гарри Поттеров и Гермион. Плевать они хотели на ваши знания MFC и GDI. Им еще предстоит изобрести новые паттерны и написать свои толстые книги заклинаний и рецептов.

Но это потом. А сейчас - начало очередного витка, огонь в руках и новые звезды в глазах. Программировать снова интересно! "Ени-бени-раба! И мысленно щелкнуть хвостом."
code

Сходил на хакатон. Выиграл. =)

Сегодня я сходил на второй в жизни "хакатон". Это когда собирают кучу программистов вместе и они колбасят код в течение нескольких часов, а потом смотрят, что получилось.

Первое мероприятие подобного типа было месяц назад

Апрельский хакатон проводился в офисе местной компании F5 Networks и был организован рядом компаний, так или иначе связанных с модной и неотвратимой нынче темой мобильных приложений:

  • AT&T - мобильный оператор с которого начался iPhone
  • Sencha - HTML5/JS фреймворк для разработки мобильных приложений и не только, основан создателем Ext JS. Дает нативный интерфейс на всех платформах, особенно полезна в паре с phonegap, который дает доступ низкоуровневым фишкам.
  • phonegap - портирует веб-приложения на нативные платформы, добавляя "хуки" для железных функций: камере, гироскопу, GPS, адресной книге и пр.
  • apiGee - онлайн дебаггер-конструктор для целой кучи API разных сайтов.
  • appMobi - онлайн система для выкатки мобильных приложений в магазины, мониторинга пользователей, автоматической выкатки апдейтов и сбора статистикю
  • redfoundry - очень высокоуровневый "онлайн-конструктор мобильных приложений", т.е. буквально тыканием в разные модули на сайте можно сваять mash-up приложение, звать разные API, пересылать данные туда-сюда и вызывать нативные функции телефона.
  • mongolab - онлайн база данных MongoDB (помните Dabble.db? вот так же, только для Mongo).
  • родной нынче Amazon в лице евангелиста Джеффа Барра рекламировал использование AWS для серверной части приложений.

Первый блин у меня получился комом тогда. Среди пришедших 90% не занимались веб разработкой до этого. Мой опыт состоял в незаконченном iPhone приложении с помощью iUI (которое я забросил из-за отсутствия интереса со стороны CQG и моего ухода) и пару дней интенсивного ковыряния HTML5, jQuery & CSS3.

Я состыковался с соседом по столу - программистом из Microsoft (Мохаммад, родом из Иордании), и мы решили сделать прогу с помощью Sencha. Что оказалось ошибкой - нахрапом библиотеку Sencha Touch освоить практически невозможно - навороченная архитектура MVC + отсутствие вменяемых туториалов оказалось непосильно. В итоге я закончить не успел, несмотря на то, что теребил парней из Sencha до последнего. А Мохаммад тупо ушел по семейным обстоятельствам. =)

Но ничего, я понял, что за один день можно узнать дофига нового тупо просматривая все эти API и фреймворки и стараясь их использовать, посмотрел с чем народ выходит в конце и за что дают призы. На кодирование было часов 4-5 всего, что добавляет жару. Общий план дня был: с 9 утра до обеда - презентации вендоров, потом 4-5 часов кодирования, потом презентации участников, призы и вечеринка до упора.

Сегодня был второй хакатон по подобному принципу

В этот раз это был "выхлоп" выставки-конференции (платной) unplugged11.webdirections.org которая проходила в Сиеттле на этой неделе. Хакатон назывался Amped.

Тема была "Next 50" - 50-летие мировой "выставки достижений народного хозяйства", которое состоится в следующем году. Это именно та выставка, для которой для привлечения туристов в 60-х построили Космическую Иглу в Сиеттле (занимательный факт: эта башня изначально была не белой, а ярко оранжевой!). Второй темой была - приложения, связанные с данными о местоположении (геолокацией, читай: GPS).

Так что, на следующий год город готовится уже сейчас, и они, помимо прочего, заинтересованы в создании "модных" акций и мобильных приложений для привлечения туристов (и "освоения" денег =)).

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

  • Sencha - см выше
  • WAC (Wholesale Applications Community, хотя нам сказали что теперь это Web Applications Consortium) - подразделение AT&T, которое разрабатывает платформу для создания специализированных веб-магазинов "по интересам" для мобильных приложений как вариант решения проблемы "обнаружения новых приложений" среди сотен тысяч их на iTunes. Как часть этого дела, они сделали враппер, который заворачивает приложение, написанное на HTML5/JS/CSS в какой-то пакет, который затем может быть запущен в их магазине. Это все, что я понял. Но они были одними из главных спонсоров.
  • rhomobile - довольно оригинальный вариант платформы а-ля phonegap. Пишем простой интерфейс на HTML5 (с использованием Sencha, jQTouch, jQuery Mobile или того же iUI), добавляем серверную часть на Ruby. Они все это заворачивают в бинарь с интерпретатором Ruby + SQLite + веб-броузерным окошком и получают "нативное" приложение для всех платформ. При этом, как я понял, бесплатно! Плюс, тоже дают возможность серверную часть сделать отдельно и хостить у них, платно.
Также была парочка компаний-участников выставки:
  • geoLoqi - сервис, который мы заюзали для нашего супер-пупер приложения, детали ниже.
  • groundspeak - компания, которая делает игру "поиск сокровищ". Это вроде как, city quest, но постоянно происходящий - т.е. в разных частях города народ прячет всякие вещи и записки, и потом другие люди их пытаются найти, следуя подсказкам и GPS. Они вроде как сделали API для построения большего количества игр на эту тему.
  • Mobilista - фреймворк для легкой интеграции PayPal платежей в мобильные приложения (одноразовых и по подписке)
  • simplegeo - платформа/API для создания мобильных приложений с использованием разных данных об организациях и другой информации. Они себя не презентовали, я видел только упоминание, поэтому чем это лучше Google Maps я не сильно понимаю

В этот раз презентаций практически не было вообще. Всю информацию я собрал сам, пройдя по залу и поговорив с представителями контор. Мероприятие началось в 9 утра сразу с команды "ну что, поехали!" и колбасили мы до 5 вечера.

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

В этот раз я усиленно агитировал народ с работы, хотя в итоге все равно пришел один коллега, да и тот по нулям насчет веб-программирования. Но мы оказались за одним столом с со-основателем geoLoqi Aaron Parecki (польская фамилия, но сам он родился в США) плюс к нам присоединился человек Кирилл Зубовский, который уже немного разбирался в программировании на Ruby + создании веб сайтов, так что дело поехало.

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

Технически они дают нативное приложение для iPhone, которое мониторит координаты с телефона и отсылает их на ваш сервер. Плюс, оно открывает фрейм на ваш сайт, который вы контролируете. Вы со своего веб-сервера делаете все что угодно - рисуете карту через Google Maps, управляете игрой, начисляете очки и пр. В качестве идентификаторов пользователей используются их Twitter-аккаунты. Можно также отсылать пользователям обратно push-сообщения или SMS. Нативное приложение-клиент тоже можно кастомизировать до неузнаваемости. Вобщем, такой себе фреймворк, который заточен под легкую обработку локационных данных групп пользователей - "точки интереса", положения пользователей, скорость передвижения, автоматические триггеры при входе/выходе из "точек" и пр.

Короче, раз уж мы засели за один стол с Аароном, который пришел больше как ментор чем участник, мы решили использовать его фреймфорк и знания, и сделать приложение, связанное с картами. Sencha я так и не выучил к тому времени, rhomobile было страшновато осваивать, а после нашего первого брейн-шторма мы вобщем-то поняли, что geoLoqi вполне можно приспособить для чего-нибудь эдакого.

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

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

Короче, это оказалось отличной идеей. Другие в основном колбасили программы на подобие "список экспонатов выставки / достопримечательностей города и поиском по них на карте".

Ребята оказались серъезные до истерики. Провели пол часа в поисках названия приложения с незанятым доменом. Дальше все пошло параллельно. Купили домен. Завели репозиторий на GitHub. Завели твиттер-аккаунт. Взяли пример сервера Ruby для работы с geoLoqi, "обработали напильником" до того, чтобы оно делало что нам нужно. Нарисовали цифры "50" на карте, наставили точек. Собрали логины twitter аккаунтов с остальных участников. Захардкодили их в точки все, кроме одной - того ресторана, где мы находились. Сделали презентацию со слайдами и скриншотами. Попутно Кирилл как самый помешанный блоггер и твиттер вещал в интернет обо всем что мы делали.

В конце сделали демо (как всегда самый большой прокол с подключением ноута к проектору). Показали карту в браузере, где светились все точки в созвездии "50" кроме одной. Кирилл врубил телефон и "медленно вбежал в зал", так что его координаты вошли в систему и зажгли последнюю звезду. Получили СМС на его телефон. Ура!

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

Понравилось! Надеюсь, доведем это дело до ума. Там, глядишь, и EB-5 не за горами (или EB-6, если ее примут в конгрессе). =)

Сайт-визитка: WeFigured.com (название с каламбуром: может читаться как "мы сделали фигуру" и "до нас дошло").

Демо сервер сейчас скорее всего не доступен (попробовать), потому как запускался на макбуке Аарона, подсоединенного в инет через мобильный телефон и через редирект с его публичного веб сервера по SSH...

(фотки стащил у Кирилла, который тоже написал пост на английском у себя)
code

Неожиданно узнал про Flash Cookies

Читая всякие статьи про веб-разработку случайно наткнулся на упоминание о Zombie Cookies и через них вышел на Local Shared Objects — файлах, которые флеш использует в качестве своих внутренних cookies.

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

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

Уже есть позов на Quantcast и ряд компаний, которые использовали их технологию. Среди тех, что знаю — Hulu, MTV, Scribd, ESPN ну и другие дочерние компании Viacom Media (Quantcast тоже дочерней является).

Заодно до меня дошло, наконец, как эти все отслеживания работают. Я все раньше удивлялся — ведь куки вроде только доступны тем серверам, которые их создали — как же меня можно отследить. А, получается, все просто (лучше поздно, чем никогда): если все крупные сайты используют одного "маркетингового" провайдера данных, то они, поставив его флешку себе на сайт, станут поставлять ему данные о своих посетителях. Таким образом каждый сайт вроде как знает только о своих, но зато в Quantcast стекается информация от всех клиентов, и чем больше сайтов в этом участвуют, тем точнее общие данные. Так они и выясняют, какого вы пола, где живете, семейное положение, годовой доход и прочее. А потом уже позволяют показывать вам рекламу для "вашего сегмента".

Quantcast, по их словам, уже "ошибку" с зомби-куками починили. Адобе сделала страничку настроек, где можно посмотреть, какие сайты держат флешевые куки на вашем компьютере. Там можно их убрать и запретить их вообще. Но отключение кук полностью не рекомендуется — некоторые сайты могут перестать нормально работать. Поэтому, более гуманный и правильный способ — использовать Firefox addon "Better Privacy", который может их удалять при выходе из браузера, или по таймеру.

Бр-р-р. Не ожидал я такой "банки с червями" от Adobe и компании. Не зря Apple не хочет их пускать на iPad и iPhone.
code

Недо-читабельность в Perl чревата ошибками

Сегодня наткнулся на замечательный дефективный анти-паттерн в перловом коде:

if( not $a || not $b ) { ...complain... }

Обычно используется для проверки можно ли дергать методы / свойства объекта. При этом количество сравнений может встречается и больше двух:

if( not $a || not $a->property1() || not $a->property2() )

Мама дорогая!

А что хотели-то: заменить логические операции их словесными эквивалентами. То есть, чтобы вместо сишного кода:

if( !$a || !$b )

Получить что-то чуть более человеческое:

if( not $a or not $b )

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

PS:

perl -e "for $a (0..1) { for $b (0..1) { print qq(a=$a b=$b, a or b is absent? ), (not $a || not $b)?'yes.':'no. ',qq( really? ),(!$a||!$b)?'yes':'no',qq(.\n); }}"

a=0 b=0, a or b is absent? no.  really? yes.
a=0 b=1, a or b is absent? yes. really? yes.
a=1 b=0, a or b is absent? no.  really? yes.
a=1 b=1, a or b is absent? no.  really? no.