суббота, 28 августа 2010 г.

[prog] Вот чего никогда не понимал в C-подобных языках, так это попытки найти максимум ошибок при компиляции

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

А вот при переходе на C, а затем и на C++, пришлось столкнуться с совсем другим поведением. C-шный компилятор пытался найти максимум ошибок и останавливался только когда их оказывалось слишком много. При этом, по моим субъективным впечатлениям, в 90% случаев только первая ошибка диагностировалась правильно. А все последующие были наведенными. Но чтобы понять это приходилось тратить время. Поэтому я уже давно при компиляции поступаю так: исправляю первую ошибку и запускаю компиляцию повторно, без попыток исправить сразу остальные найденные компилятором ошибки.

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

72    private :
73       //! Агент, от имени которого нужно выполнять логирование.
74       const so_4::rt::agent_t & m_agent,
75       //! Конфигурация cp_service.
76       const cfg_t & m_cfg,
77       //! Интерфейс доступа к БД.
78       db_iface_t & m_db;

на что компилятор (VC++ 2008 SP1) выдает мне:

.\ig_cp_service_2/h/new_outgoing_packages_processor.hpp(76) : error C2143: syntax error : missing ';' before '&'
.\ig_cp_service_2/h/new_outgoing_packages_processor.hpp(76) : error C2259: 'so_4::rt::agent_t' : cannot instantiate abstract class
        due to following members:
        'const char *so_4::rt::agent_t::so_query_type(void) const' : is abstract
        .\so_4/rt/h/agent.hpp(200) : see declaration of 'so_4::rt::agent_t::so_query_type'
        'void so_4::rt::agent_t::so_on_subscription(void)' : is abstract
        .\so_4/rt/h/agent.hpp(214) : see declaration of 'so_4::rt::agent_t::so_on_subscription'
.\ig_cp_service_2/h/new_outgoing_packages_processor.hpp(76) : warning C4228: nonstandard extension used : qualifiers after comma in declarator list are ignored
.\ig_cp_service_2/h/new_outgoing_packages_processor.hpp(76) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
.\ig_cp_service_2/h/new_outgoing_packages_processor.hpp(78) : error C2143: syntax error : missing ';' before '&'
.\ig_cp_service_2/h/new_outgoing_packages_processor.hpp(78) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
.\ig_cp_service_2/h/new_outgoing_packages_processor.hpp(78) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

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

А ошибка, в общем-то тривиальная: после атрибута m_agent я поставил запятую, а не точку с запятой (строка 74). Но диагностировать он это смог только в строке 76. И выдал более-менее понятную первую ошибку – нет точки запятой (правда я не понимаю, почему было не сказать, что нет точки с запятой перед ‘const’ или хотя бы перед ‘cfg_t’, а не перед ‘&’). Остановилась бы на этом компиляция и всех делов. А так пришлось пару минут тупить, чтобы забить на ругань компилятора об абстрактных классах и весь последующий бред :)

[life.photo] Чады под контролем :)

Не могу не запостить у себя. Глядя на это снимок вспоминаю, как моя дочка, будучи совсем маленькой умудрялась в мгновение скрыться из поля зрения, и задумываюсь, а хорошо ли то, что у людей нет хвостов (ну хотя бы в детстве)? ;)

Baboons in New-York Zoo

Это два маленьких бабуина в зоопарке Нью-Йорка. Снимок найден в WSJ's Picture of the Day.

пятница, 27 августа 2010 г.

[life.sport.darts] Провели второй турнир по дартс в офисе

У нас в офисе довольно много любителей побросать в свободное время дротики в мишень. Но только пятеро согласились регулярно играть в разновидности n01 (101, 170, 301, 501) с двойным завершением. Это т.н. “высшая лига” нашего офиса :) Но пятеро – это мало, хотелось бы расширить наш состав новыми игроками. Для чего был придуман и воплощен в жизнь коварный план… (продолжение под катом для тех, кому это интересно)

среда, 25 августа 2010 г.

[prog] Третья часть интервью Александреску на informit.com

На informit.com опубликована третья часть интервью Андрея Александреску о языке D (вот первая и вторая части).

Главное для меня в этой части: описание языка в книге The D Programming Language очень близко к тому, что Александреску и Брайт хотят получить в релизе D2. После чего все новые изменения в языке они собираются делать с большой оглядкой на обратную совместимость. Т.е. такой фигни, как была с D1 и D2 они больше повторять не хотят.

[prog.flame] Афигительно: Я выбрала распределенный back-end в С++.

Через rusdoc.ru до меня дошла ссылка на хабровский пост “Стажировка в Google 2 (Часть 1)”. Цитирую:

…Вторая часть была несколько интереснее — в ней предлагалось вписать, чем мне было бы интересно заниматься по трем пунктам: архитектурный уровень (front-end или back-end), область компьютерной науки (искусственный интеллект, распределенные вычисления, низкоуровневое программирование, компиляторы итп.) и язык программирования.

Я выбрала распределенный back-end в С++. Правда, я довольно смутно представляла себе, что это такое, тем более что моя первая стажировка — это был даже не front-end, а чистый дизайн в Photoshop и с активным пользованием Javascript/HTML/CSS. Забегая вперед, хочу сказать, что я получила именно то, что хотела. И «было сложно, но мы смогли»: о).

Ебать-копать! Очень хочу почитать аналогичные воспоминания студента медицинского института, который сначала стажировался (т.е. приобретал практический опыт после освоения соответствующей теории) в стоматологии, а потом решил “постажироваться” в гинекологии или микрохирургии глаза, имя лишь смутные представления о том, что же это такое.

[life.sport.darts] Неожиданный эффект хвостиков t01 и перышек pear-формы

Это пост про дартс с фотографиями, поэтому прячу под кат, чтобы не грузить тех читателей, кому это не интересно.

вторник, 24 августа 2010 г.

[life; prog] Воспользовался Интернет-банкингом от БПС-Банка

Поскольку я теперь владелец Visa Virtuon, то решил оплатить коммунальные и прочие услуги как продвинутый пользователь – через Интернет-банкинг БПС-Банка. Оплатил. Прикольно было видеть как после ввода, скажем, лицевого счета или номера договора появляется актуальная информация от комунальщиков, водоканала и др.

Но осадочек остался :( Сразу видно, что изобретатели данной системы оплаты услуг через Интернет сами ей никогда не пользовались (старая тема, которую я поднимал год назад). Убили три вещи:

  1. Для подтверждения операции нужно вводить сессионный ключ (из списка выданных мне в банке). Но, внимание, десятизначную последовательность нужно вводить в поле ввода пароля. Т.е. я не вижу циферок, которые набираю. Зачем эта параноидальная безопасность? На случай, если я работаю в Интернет-кафе, а не дома? Так ведь в Интернет-кафе запросто могут стоять key-logger-ы, которые слямзят мой ключ даже если я сам не вижу, что ввожу. Или на случай, что кто-то может подсмотреть ключ на экране? Так ведь я должен достать бумажку со списком ключей, потом найти на ней ключ, потом ввести его…
  2. Нет возможности сформировать корзину платежей, а потом оплатить все скопом одной операцией. Приходится сначала выбрать, скажем, оплату за телефон, потом оплату за ByFly, потом за газ, за воду, за домофон, за вывоз мусора, за капремонт, за квартплату, за теплоснабжение, за антену… И каждый раз нужно подтверждать, что это именно ты платишь, поэтому приходится вводить разные сессионные ключи на каждый платеж. Павбывавбы!
  3. Выбор объекта платежа нужно каждый раз начинать заново. Т.е. выбирать пункт “Платежи по городам”, потом “Гомельская область”, потом “г.Гомель”, потом “Услуги ЖКХ”, потом “КЖРЭУП Новобелицкое”, потом “Вывоз мусора”. Делать платеж. Потом проходить весь этот путь заново только для того, чтобы выбрать рядышком “За пользование лифтом”. Редиски, чес слово. Нет чтобы место моего последнего платежа сохранить и потом туда же вернуться.

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

А вот если бы у банка было несколько платформ Интернет-банкинга, которые бы имели свой процент с on-line операций и конкурировали между собой… Тогда у них был бы стимул повышать usabillity своих продуктов.

PS. А вот интересно, если ли в Беларуси (или в России, или в других странах СНГ, или вообще других странах) Интернет-сервисы, специализирующиеся на оплате коммунальных и прочих услуг, имеющие выходы на соответствующие биллинги, но не связанные с конкретным банком? Чтобы им мог воспользоваться владелец пластиковой карты любого банка.

понедельник, 23 августа 2010 г.

[prog] Бинарные сборки новых версий Ruby под Windows

На http://ftp.ruby-lang.org/pub/ruby/binaries/mswin32/ появились бинарные сборки новых версий Ruby для Windows:

  • ruby-1.8.7-p302 – bug fix релиз, закрывающий дыры в безопасности Ruby 1.8.7 (подробнее);
  • ruby-1.9.1-p430 – аналогичный bug fix релиз, но для Ruby 1.9.1 (подробнее);
  • ruby-1.9.2-p0 – первый релиз Ruby 1.9.2 (подробнее).

[prog.work] В продолжение темы предсказания сроков

В комментарии к заметке “О предсказании сроков написания программ” ув.тов.имя затронул тему оптимизации и ускорения рабочего процесса. Посему я ниже изложу несколько банальностей, которые задолго до меня были описаны в старых и хороших книжках (вроде “Человеческого фактора” aka Peopleware).


Рекомендации по организации рабочих мест и процесса:

  • сажать больше трех разработчиков в одну комнату – значит уменьшать эффективность их труда. В недостижимом идеале каждому разработчику нужна отдельная комната с дверью, в которой можно полностью отгородиться и погрузиться в задачу. Если это невозможно, то хотя бы отдельные кабинеты для 2-3 человек;
  • в одной комнате должны размещаться только участники одной проектной команды. Наверное, если рядом сидят трое C-шников-драйверописателей, четверо J2EE-разработчика и два PHP-шника, то у них найдется много интересных тем для разговоров (начиная от спорта и заканчивая священными войнами об обязательной необходимости закапывания С вместе с PHP). Но на работе такое соседство будет сказываться негативно;
  • каждому разработчику не нужен внутренний телефон. Менеджменту, наверное, удобно, в любой момент набрать номер любого разработчика и спросить: “А какого, собственно, х…” А вот разработчику это мешает, иногда сильно. Мешает так же и соседям по комнате. Так что телефонные переговоры разработчиков нужно уменьшать до самого необходимого минимума – в идеале, забрав у них внутренние телефоны вообще;
  • уменьшить количество совещаний и количество участников совещаний. Если кто-то собирается созвать совещание с участием шести и более человек, то это прямой путь к убиванию полезного времени участников совещания.

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

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

Любое из этих занятий введет вас в конструктивное русло, направит мысли на созидание. А это очень заразный и захватывающий процесс. Который позволит плавно перейти и к решению ненавистной текущей задачи.

Но есть важный момент. Нужно заняться созданием чего-то своего. Написание комментариев к чужим постам или ответов на форумах – это не то. Чтение статей, книг или документации – это так же не то. Только создание чего-то своего своими руками.


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

воскресенье, 22 августа 2010 г.

[life.photo] Ненастоящие пейзажи Matthew Albanese

Сегодня в рубрике “Знакомство с фотомастером” представлен Мэтью Албаниз, который снимает поразительно красивые и впечатляющие пейзажи. Но не настоящие, а сделанные вручную из подручных материалов.

Под катом несколько таких снимков.