четверг, ноября 13, 2008

Unit test framework для языка Perl


Хотя на работе я пишу в основном на 2-х языках, на C++ и Perl, идея того, что юнит тесты можно писать и для скриптов на Perl’е, а не только для C++ программ, пришла мне в голову относительно недавно. Perl не относится к числу простых в изучении языков, да и синтаксис у него такой, что можно голову сломать порою, так что автоматизированная  проверка скриптов на то, что они делают то, для чего они были написаны, в общем, не плохая идея.

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

s/((?:(?! [-_] )[\w-]+\.)+[A-Za-z][\w-]+)/”$1 “( ($addr = gethostbyname($1))?”[" . inet_ntoa($addr) . "]” : “???”)/gex;


Полез искать юнит тест фреймворк для Perl’а - нашёл несколько, но реально попробовал только один:Test::More.
Чтобы его установить на Windows, нужно проделать несколько шагов:

  1. Скачать его со CPAN - Test-Simple-0.86.tar.gz.
  2. Разархивировать
  3. Выполнить:  perl Makefile.pl
  4. Найти утититу nmake.exe (она, к примеру, в Visual Studio есть).
  5. Выполнить:
    nmake
    nmake test
    nmake install
Всё, после этого этот модуль установлен, можно пользоваться, вот, скажем, пример из туториала к нему:

#!/usr/bin/perl -w

use Test::Simple tests => 8;

use Date::ICal;

$ical = Date::ICal->new( year => 1964,
month => 10,  day => 16,
hour => 16, min => 12, sec => 47,
tz => '0530' );

ok( defined $ical, 'new() returned something' );
ok( $ical->isa('Date::ICal'), "  it's the right class" );
ok( $ical->sec   == 47,       '  sec()'   );
ok( $ical->min   == 12,       '  min()'   );
ok( $ical->hour  == 16,       '  hour()'  );
ok( $ical->day   == 17,       '  day()'   );
ok( $ical->month == 10,       '  month()' );
ok( $ical->year  == 1964,     '  year()'  );

А вот что это выдаёт в результате:

1..8
ok 1 - new() returned something
ok 2 -   it's the right class
ok 3 -   sec()
ok 4 -   min()
ok 5 -   hour()
not ok 6 -   day()
#     Failed test (- at line 16)
ok 7 -   month()
ok 8 -   year()
# Looks like you failed 1 tests of 8.


Тут тестируется стандартный модуль Date::ICal - проверяется, что этот объект создаётся и правильно инициализируется. Для тестирования тут используется Test::Simple - упрощенная версия Test::More, которая также входит в поставку. Test::More содержит порядка 15 тестовых примитивов, типа is, ok, like и др, при помощи которых можно проверять в основном равенства/неравенства, При помощи like, в частности, можно тестировать регулярные выражения.

воскресенье, ноября 09, 2008

Русский перевод Boost::test документации


Я посмотрел на статистику Google Analytics моего блога и обнаружил, что одними из самых популярных страниц в нём являются статьи про библиотеку Boost (про unit testing и сборник ссылок на русские переводы документации по Boost). Так что раз люди это ищут, они это получат :) Ниже мой перевод куска документации с введением в юнит тестирование при помощи Boost::test.

Hello the testing world. Введение в тестирование с использованием Unit Test Framework.

Как программа должна сообщать об ошибках? Обычный способ - это показ сообщения об ошибке:

if( something_bad_detected )
std::cout << "something bad has been detected"
<< std::endl;
Однако, чтобы узнать, случилась ли ошибка, такой способ требует проверки вывода программы после каждого запуска. Поскольку юнит-тестовые программы запускаются обычно часто (как часть процесса регрессионного тестирования), то ручная проверка на наличие сообщений об ошибках - это слишком неэффективное решение. Фреймворки для тестирования, такие как GNU/expect, могут делать эти проверки автоматически, но они слишком сложны для простых тестов.


Лучше и проще для тестирующей программы использовать следующий метод сообщения об ошибках - возвращать EXIT_SUCCESS (как правило 0) в случае отсутствия ошибки и EXIT_FAILURE в случае её обнаружения. Это позволит скрипту для регрессионных тестов автоматически определять успех/провал теста. В дальнейшем скрипт может создать HTML таблицу с результатами тестов, послать email или сделать что-то ещё без необходимости изменять сам C++ код юнит тестов.


Протокол тестирования, основанный на этом подходе, не требует для своей реализации  никаких дополнительных средств, библиотек и т.п, для этого вполне достаточно языка C++ и стандартной библиотеки STL. Программист должен, однако, помнить о необходимости ловить все возможные исключения и конвертировать их в выходы из программы с ненулевым кодом возврата. А также программист не должен использовать макро assert() из стандартной библиотеки, так как на некоторых системах это приводит к нежелательным сторонним эффектам - к появлению окошка, требующего реакции пользователя.


Unit Test Framework из библиотеки Boost создан для автоматизации таких задач. Функция main() из библиотеки сделана для того, чтобы освободить пользователя от заботы об обнаружении ошибок и генерации отчётов. У пользователей есть возможность использовать средства библиотеки для выполнения сложных проверок. Давайте взглянем на следующую простую программу юнит тестирования:


#include <my_class.hpp>
int main( int, char* [] )
{
  my_class test_object( "qwerty" );
  return test_object.is_valid() ?
    EXIT_SUCCESS : EXIT_FAILURE;
}


С этим юнит тестом есть несколько проблем.


Вам нужно конвертировать результат вызова is_valid() в нужный код возврата. Если при конструировании test_object или при вызове is_valid() возникнет исключение, программа завершится аварийно. Вы не увидите никаких сообщений, если запустите тест вручную. Unit Test Framework решает все эти проблемы. Для его использования эта программа должна быть изменена следующим образом:


#include <my_class.hpp>
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE( my_test )
{
  my_class test_object( "qwerty" );
  BOOST_CHECK( test_object.is_valid() );
}


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


#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>

int add( int i, int j ) { return i+j; }

BOOST_AUTO_TEST_CASE( my_test )
{
  // seven ways to detect and report the same error:
  BOOST_CHECK( add( 2,2 ) == 4 ); // #1 continues on error
  BOOST_REQUIRE( add( 2,2 ) == 4 );// #2 throws on error
  if( add( 2,2 ) != 4 )
  BOOST_ERROR( "Ouch..." ); // #3 continues on error
  if( add( 2,2 ) != 4 )
  BOOST_FAIL( "Ouch..." );  // #4 throws on error
  if( add( 2,2 ) != 4 ) throw "Ouch...";// #5 throws 
  // on error 
  BOOST_CHECK_MESSAGE( add( 2,2 ) == 4, // #6 continues
  // on error
  "add(..) result: " << add( 2,2 ) );
  BOOST_CHECK_EQUAL( add( 2,2 ), 4 ); // #7 continues
  // on error
}


(1)

В этом варианте используется BOOST_CHECK, который показывает сообщение об ошибке (по умолчанию он его выводит в std::cout), которое включает в себя выражение, не прошедшее проверку, имя файла с исходниками, и строку в нём. А также он увеличивает счётчик ошибок. При завершении программы счётчик ошибок будет автоматически показан средствами Unit Test Framework.

(2)

Этот вариант использует BOOST_REQUIRE, средство, во всём подобное #1, за исключением того, что после вывода сообщения об ошибке генерируется исключение, отлавливаемое затем Unit Test Framework. Это используется тогда, когда возникшая ошибка настолько серьёзна, что делает дальнейшее выполнение программы бессмысленным. BOOST_REQUIRE отличается от макроса assert() стандартной библиотеки тем, что перенаправляет обнаруженную ошибку в унифицированную процедуру генерации отчётов из Unit Test Framework.

(3)

Вариант использования, похожий на #1, за исключением того, что обнаружение ошибки и сообщение об этом кодируются по отдельности. Это может быть полезно при сложном условном операторе с несколькими условиями, о провале каждого из которых можно сообщить отдельно.

(4)

Вариант использования, похожий на #2, за исключением того, что обнаружение ошибки и сообщение об этом кодируются по отдельности. Это может быть полезно при сложном условном операторе с несколькими условиями, о провале каждого из которых можно сообщить отдельно.

(5)

Этот вариант бросает исключение, отлавливаемое затем Unit Test Framework. Показываемое сообщение об ошибке будет более информативным, если исключение было унаследовано от std::exception, или является char* или std::string.

(6)

Этот вариант использует средство BOOST_CHECK_MESSAGE, похожее на #1, за исключением того, что подобно варианту #3 показывает альтернативное сообщение об ошибке, описанное во втором аргументе.

(7)

Этот вариант использует средство BOOST_CHECK_EQUAL, похожее на #1. Лучше всего это подходит для проверки на равенство двух переменных, так как в случае несовпадения показывает оба значения.


P.S. Для того, чтобы увидеть, что этот Unit Test Framework выводит в случае обнаружения ошибки я исправил первую проверку на заведомо неправильную:
BOOST_CHECK( add( 2,2 ) == 5 );

В этом случае программа выдала следующее:
Running 1 test case… 

c:/boosttest/unittests.cpp(12): error in “my_test”: check add( 2,2 ) == 5 failed

пятница, октября 31, 2008

Энциклопедия Google knol начала поддеживать другие языки

Наконец-то google начала переход от моноязычной беты к чему-то более менее полезному. Поддержки русского языка, правда, официально до сих пор нет, добавили только немецкий, французский и итальянский. Но, думаю, и до остальных языков дело скоро дойдёт. Не официально писать knol’ы на русском никто не мешает. В данный момент по моим прикидкам их написано в районе нескольких сотен. Статистики там я не нашёл, приходится изворачиваться чтобы её узнать - поиск по букве "в", которая встречается исключительно в текстах на кирилице, даёт что-то в районе 900 статей, правда сюда попадают украинские и  болгарские статьи, но их не так много.

Моя экспериментальная статья там про бесплатные игровые движки наконец-то начала находится в обычном google’овском поиске, а не только во внутреннем. Как и ожидалось, google отдаёт предпочтения страницам в Knol перед прочими, использует своё конкурентное преимущество. По крайней мере гугление по словам "бесплатные игровые движки" на первых 2-х местах выдаёт мою knol’овскую страницу и её источник - статью о движках с моего блога. Википедия только на 6-м. Кстати, переиндексация - мгновенная, не успел я в knol’овской статье переправить ссылку со старого блогспотовского на этот блог, как в результатах гугловского поиска старый блог сменился новым.

Мораль, в общем, такая - knol скоро активно засрут seo-шники уже можно пользоваться этим, правда пока не с целью поиска информации (для этого пока пригодна только википедия), а с целью её предоставить и получить от этого какую-то выгоду в виде трафика на свои сайты или напрямую через Adsense на странице.

четверг, октября 23, 2008

Задачки по программированию

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

  • www.spoj.pl. По ссылке - список “классических проблем”, количество человек, которые пытались это решить и количество решений, признанных правильными.
  • projecteuler.net. Тоже список алгоритмических задачек. Задачки попроще, чем на первом сайте.
  • www.topcoder.com. Online соревнования программистов в области алгоритмов, проектирования, тестирования. Кроме соревнований там лежат неплохие туториалы по алгоритмическим аспектам программирования.
  • acm.timus.ru, acm.sgu.ru, acm.mipt.ru - русские сайты аналогичного содержания, архивы задач с различных соревнований по спортивному программированию. Правда основное содержание всё равно на английском, поскольку людей натаскивают на участие в международных соревнованиях.

вторник, октября 21, 2008

Programming skills которые вы хотели бы изучить

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

На англоязычном сайте вопросов и ответов для программистов stackoverlow.com один человек задал вопрос: “What is the one programming skill you have always wanted to master but haven’t had time?” То есть, в вольном переводе - что в области программирования вы всегда хотели изучить, но у вас никогда на это не хватало времени?

Самые популярные ответы:

  • Функциональное программирование.
  • Как перейти наконец на полностью автоматизированное юнит-тестирование.
  • Программирование игр, в частности 3D графики
  • Как писать драйвера устройств
  • Мультипоточное программирование
  • Изучить скриптовые языки типа Ruby и Python.
  • Создание компиляторов/интерпретаторов  для языка программирования
  • Изучение ассемблера
  • Нейронные сети
  • Регулярные выражения
  • Lisp / Scheme
  • Научиться пользоваться отладчиком WinDbg
  • Изучить язык функционального программирования Haskell
  • C++
  • Распределённые вычисления. Научиться проектировать и разрабатывать системы подобные world community grid or folding@home.

В общем, над некоторыми пунктами списка полезное помедитировать на досуге.

среда, октября 08, 2008

Сорокин и SEO

Дочитываю трилогию В. Сорокина "Лёд, Путь Бро, 23000". Складывается впечатление, что иногда он пишет не для людей, а SEO-оптимизированный текст для роботов яндекса и google :)

"На работе мясных машин ждали просто машины или бумага, покрытая буквами; дома — другие мясные машины и еда, приготовленная ими. Весь город состоял из маленьких каменных пещер. В каждой пещере жила семья мясных машин. Пещера крепко запиралась от других мясных машин, хотя и те и другие конструктивно ничем не отличались. Но мясные машины боялись друг друга, потому что у одних пещеры были большими, а у других — маленькими. На работе мясные машины зарабатывали деньги, чтобы купить на них еду и одежду. В пещере они ели, спали и производили новые мясные машины. Это происходило ночью: мясные машины ложились друг на друга и двигались. Потом в одной из них начинала расти маленькая мясная машина. Через 9 месяцев она выходила на свет и начинала свою жизнь в пещере. Она росла и постепенно становилась нормальной мясной машиной. Так жили мясные машины в своем городе".

Проверил предположение - и действительно, поиск по ключевым словам "мясные машины" выдаёт в основном сайты, посвященные творчеству Сорокина. Не понятно только, зачем это надо, это же явный низкочастотник. По данным wordstat.yandex.ru - всего 8 показов в месяц :)

понедельник, сентября 29, 2008

Boost на русском


Я уже писал как сложно найти русскую документацию по библиотекам boost для c++. Для удобства я решил собрать всё краткие введения в различные библиотеки этого пакета на русском, найденные в рунете, которые показались мне более-менее полезными, чтобы получить общее представление о конкретной библиотеке. Дальнейшее изучение возможностей этих библиотек всё равно требует чтения документации на английском.
Итак:


  • Boost Smart pointers. Умные указатели, Boost::Shared_ptr, Boost::Weak_ptr, Boost::Intrusive_ptr.
  • Boost::Multi_index - улучшенный вариант контейнеров STL.
  • Boost::Spirit - библиотека для создания парсеров. Пример использования Spirit 2.
  • Boost::Regex - использование регулярных выражений в С++. Ещё одно введение в библиотеку - Boost это просто. Часть 1. Boost.Regex на хабре.
  • Boost::Xpressive - альтернатива Boost::Regex. Также работа с регулярными выражениями. Это описание и 4 предыдущих найдены на блоге Alno’s Blog: C++, Java и Rails
  • Boost::any - обобщенный контейнер, позволяющий хранить разнородные данные в одном и том же объекте.
  • Boost::Asio - для создания кроссплатформенного кода для работы с сетью. Это из блога Alex Ott’а. Еще нашёл перевод туториала по boost::asio
  • Boost::threads - библиотека для работы с потоками. Это перевод статьи первого автора этой библиотеки Уильяма Кемпфа в виде PDF. Статья старая, 2002 г, с тех пор библиотека была почти полностью переписана, хотя внешние интерфейсы изменились не сильно, так что общее представление из статьи получить всё ещё можно. 
  • Boost.DateTime - Библиотека по работе со временем.
  • На сайте sources.ru выложена кое-какая документация по библиотекам: smart_ptr, bind (работа с функторами и предикатами в алгоритмах), function (работа с указателями на функции), signal (для реализации паттернов «Команда» или «Действие» из книги банды четырёх), lexical_cast(преобразование любых типов в строки и из строк в любой тип).
  • Ещё несколько достаточно кривых введений в библиотеки boost есть на сайте solarix.ru. В частности кое-что про lexical_cast, format (форматирование строк, замена printf), regex(регулярные выражения), tokenizer (разбор строк на лексемы), и еще несколько. Но перевод ужасный. Правда есть примеры, из которых кое-что можно понять.
  • В википедии есть примеры по библиотекам uBLAS (линейная алгебра для матриц и векоров),random (генерация псевдослучайных чисел), Spirit (про него выше уже есть ссылка, в которой всё расписано более подробно), Regex, Graph (алгоритмы на графах).
  • И наконец мой собственный перевод документации Boost::test для юнит тестирования .
Вот пока всё, что я нашёл. Найду ещё что-то, добавлю.

среда, сентября 24, 2008

Программы для ведения рабочих заметок.


В ходе обычной программистской работы всегда бывает необходимость делать какие-то краткие заметки, рисунки, схемы, названия функций. Можно их рисовать в обычном блокноте (о сколько их я покрыл никому включая меня не понятными закорючками…). Можно использовать различные программы - иногда это более оправдано, в виду возможностей поиска и какой-никакой, а структуризации.
Чтение http://stackoverflow.com/ вдохновило меня как-то структуризовать возможные решения:
  • Программы для рисования Mind maps - я в последний год пользуюсь FreeMind’ом и не жалею, очень удобно разбираться в какой-то проблеме, рисуя всё более разрастающееся дерево, причём ненужные в данный момент ветви просто скрываются, а когда появляется в них нужда - раскрываются обратно.
  • OneNote - тоже весьма полезная вещь. Найденные статьи по какой-либо теме засовываются туда, причём поскольку OneNote сам добавляет ссылку на источник, всегда можно понять откуда что взялось. Да и маленькие схемки от руки там удобно рисовать.
  • Google Notebook - если нужны записи, которыми можно воспользоваться отовсюду, где есть интернет.
  • EverNote - альтернатива OneNote с возможностью синхронизовать записи на разных устройствах с помощью интернета.
  • TreePad - программа для ведения записей. Минус - её платность.
  • Всё же использовать бумажный блокнот, но структуризовать информацию в нём, например так: для одного проекта - один блокнот, на каждой странице - дата начала записей на этой странице и номер страницы. Если через несколько дней что-то ещё на неё добавляется - отчёркивается линия и пишется сегодняшняя дата. Если на странице осуществлялось что-то типа записей мозгового штурма с вариантами решения какой-то задачи, а затем было выбрано одно из них, то оно каким-то образом выделяется (галочкой, маркером, подчёркиванием), и ставится ссылка на страницу, на которой пишется, почему именно эта альтернатива была выбрана. Для отсылок на другие записи пишется что-то типа “См. стр. 13″, или если это находится в другом блокноте - “См. стр. 23, проект Альфа”.
  • Начать блог. Например вести записи по проекту в приватном режиме в ЖЖ. Вариант - wiki. К примеру http://www.tiddlywiki.com/ Можно даже сделать себе блокнот в стиле wiki на локальной машине без установки сервера - см. ScrewTurn Wiki - Desktop Edition
  • Emacs Org-Mode. Не разбирался, но похоже тоже система для ведения записей обо всём, To-Do lists, GTD, и т.п.
  • Дерево папок с текстовыми файлами. Корень - проект, дальше - какие-то задачи, листья - файлы. По мне так не слишком удобно. Типа:
    admin\
    important-stuff.doc
    development-log.doc
    development\
    projects\
    proj1\
    overview.doc

    proj2
    reference\
    some-topic.doc
  • Какая-нибудь система на основе google docs - всё ж таки расшаренные документы иногда очень полезны. Вариант - писать заметки в gmail’е и отправлять их себе же. Поскольку там есть поиск и можно присвоить разные таги - иногда тоже сгодится.
P.S. Подсказали ещё один сервис - npj.ru - блог и wiki в одном флаконе c возможностью хранить версии своих документов. Судя по описанию на сайте - тоже должно быть интересно. Можно пользоваться либо их сайтом, либо скачать у них дистибутив и установить на собственный сайт.

P.P.S. На сегодняшний день (март 2010) я реально использую персональную online wiki (Google sites), evernote (туда скидываются найденные статьи), FreeMind. Иногда на работе OneNote.

среда, сентября 17, 2008

Интересный сервис вопросов и ответов для программистов


Обнаружил недавно новый англоязычный стартап - сервис вопросов и ответов для программистов StackOverflow. Напоминает по структуре какой-нибудь digg или reddit, только создан исключительно для программистов. Сервис продвигают несколько западных top-IT блогов, таких как Joel on Software и Coding Horror, у каждого из которых количество подписчиков в районе десятков тысяч. Так что быстрый старт стартапу я думаю обеспечен.

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



Примеры вопросов и ответов:

среда, сентября 10, 2008

Хорошо быть программистом


Автор сайта Inside C++ проводил исследования юмора в ИТ-компаниях. Послал в 14 компаний резюме на "албанском". Самое интересное, что 4 компании ответили более-менее адекватно, предложив побеседовать поподробнее. Так что для мира всё ещё остаётся надежда… Мало для какой другой специальности такое бы проканало, IMHO. А тут у HR-ов видимо всё же есть надежда заполучить гениального фрика, как в кино.
Подробнее вся история тут: http://insidecpp.ru/art/31/
Само резюме:


Ф.И.О. Задруйко Федор Сиргейевич (можно просто Кросавчег)
Майо мыло тут была почта
Йезыги программированийа Превед++ 
C++ (харашо знайу бузд!) 
Шарп типа 
ВэБэ 
Дэлфи (ацтой, но тоже знаю)
Прочайа хрень WinAPI 
WTL 
MFC (фууу!) 
DirectX 10 
OpenGL 2.0 
Oracle 
MSSQL 
MySQL 
.NET Framework 1.1 / 2.0 / 3.0 
ASP.NET 
Многа девелопел в kernel-mode 
Всякая там вебовская херня, пхп там, перл, хтмл, ну и таг далейе
Инастранныйе йезыги Олбанский на уравни наситиля
А сибе Сирьезен, испалнителен, умен, талантлиф. Адним словам — мужчина хоть куда, фполнам расцвети сил
Савсем забыл! Опыт работы:
Работал в Sun Microsystems — уволилсо, нипанравилась парамушта там никто низнаит C++ :-(
Патом долга работал в Микрософте, но оттуда тоже уволился, патамушта просто надоело. Хочеццо чиво-нибудь свежынькава. Собсна паэтаму и исчу работу.
Жду вашева атвета — пешыте на майо мыло. 

пятница, сентября 05, 2008

Использование библиотек из Boost Libraries в своих проектах


В прошлом посте про юнит тестирование на С++ я упомянул про фреймворк boost::test. Сейчас активно с ним играюсь, пытаюсь найти всю возможную информацию про него и вообще про boost в целом. Как оказалось, информации на русском в сети очень мало - какие-то обрывки переводов документации здесь и это почти всё. Хуже того, и в офлайне с книгами тоже всё плохо. Есть книжка про Boost Graph Library из серии “Библиотека программиста”. Но это всего лишь об одной библиотеке из почти сотни. Наверное, есть главы с кратким описанием библиотеки в толстых книгах про шаблоны С++, хотя не уверен. Так что без чтения документации на английском видимо никак не обойтись.

На английском есть книга Beyond the C++ Standard Library: An Introduction to Boost. Я точно знаю, что где-то есть её электронные копии, но пока их не нашёл. Так что пока основной источник знаний для меня - документация с сайта www.boost.org, благо она достаточно неплохая, её по крайней мере в отличие от MSDN читать можно. Я скачал последнюю версию boost’а - 1.36.0, весит правда немало - zip файл порядка 55 Мб.

Чтобы построить бинарные файлы из исходников нужно ещё отдельно скачать утилиту Boost Jam оттуда же с сайта. В принципе для очень многих библиотек никаких бинарных файлов и вовсе не нужно - чтобы их использовать достаточно вставить  в свой проект строчку типа

#include <boost/SOME_LIB.hpp>


и всё. Но некоторые библиотеки, например boost::regex для встраивания перлообразных регулярных выражений в C++ код всё же требуют бинарных .lib файлов. Кроме того, в поставку boost’а входят исходники несколько утилит, которые компилируются также при помощи Boost Jam (bjam.exe).


В частности есть весьма полезная утилитка bcp. Если не хочется включать в проект все исходники Boost’а для всех возможных библиотек (а их ОЧЕНЬ много), с помощью этой утилиты можно выдрать только необходимые. Я наткнулся на неё благодаря этой статье в блоге Alex Ott’а.


То есть если нужны, к примеру, только unit test’ы, то при помощи команды:


> bcp boost/test/unit_test.hpp c:\tmp\boost_test


мы получим в каталоге c:\tmp\boost_test всё, что нужно для фреймворка для юнит тестирования. Остаётся включить полученное в свой проект и можно вовсю “экстремально программировать” :)


Что почитать ещё:
P.S. Подсказали, где в сети лежит Beyond the C++ Standard Library: An Introduction to Boost.

четверг, сентября 04, 2008

Unit testing для языка програмирования C++


Новые браузеры и web 2.0 сервисы - это конечно хорошо, но что то давно я не писал чего-нибудь жостко программистского… А между тем зря, поскольку, как известно, учить кого-то чему-то - это лучший способ научиться этому самому.

Решил я немного заняться  самообразованием в области методологии разработки ПО, в частности, разобраться с инструментами для юнит-тестирования программ на С++. Как известно, чтобы получить качественную программу её нужно хорошо протестировать, а для этого нужно разбираться в её структуре. А это сложно сделать постороннему тестеру. Проще и быстрее всего если тесты для разрабатываемой программы будут создавать сами разработчики параллельно (на самом деле лучше даже перед) с написанием кода .

Подход этот получил распространение в рамках методики "экстремального программирования" (одна из основных вещей для этой методики - как раз test driven development, "разработка через тестирование"). Согласно этому подходу разработчики перед тем как написать или изменить какую-либо функцию в программе должны написать новые тесты или исправить существующие для этой функциональности. Весь набор тестов выполняется каждый раз, когда в программе что-то изменилось. В этом случае все будут уверены, что при  внесении изменений ничего не сломают, а если сломают, то сразу же будет видно что и почему. За счёт этого экономится куча времени (отладка занимает гораздо меньше времени и сил).
Можно, разумеется, реализовывать такое тестирование вручную для каждого нового проекта. Но гораздо лучше пользоваться существующими библиотеками. Почти для каждого языка программирования существуют несколько библиотек (фреймворков) для выполнения unit test’ов. В частности, для C++ самыми популярными являются следующие:
  • CPPUnit - клон JUnit, фреймворка для юнит тестирования на java. Вкратце ознакомится с этим фреймворком можно например тут (на английском, скриншоты и примеры использования) или тут(русский язык!).
  • Boost::testBoost - это вообще-то коллекция независимых библиотек (их несколько десятков) для самых разных вещей - многопоточности, регулярных выражений, умных указателей, работы с графами и прочее и прочее и прочее. Многое из этой библиотеки должно войти в следующий стандарт C++ (известный как c++0x или с++09). Пишется она разными продвинутыми в c++ чуваками, многие из которых принимали участие в разработке STL (стандартной библиотеки шаблонов). Boost::test соответственно библиотека с фреймворком для unit tests. Примеры использования - например здесь.
  • TUT - маленький но ужасно гордый портабельный фреймворк для unit test’ов.  Состоит из одного заголовочного файла.
Существует ещё много подобных библиотек, с более полным списком можно ознакомиться например в википедии.

среда, сентября 03, 2008

Первые впечатления о Google Chrome


Скачал вчера вечером, успел немного потестировать. Первые впечатления - всё супер, понравилось, что он импортировал из firefox’а всё что можно, не только букмарки, но и историю посещений, пароли, настройки прокси, так что можно продолжать серфить по знакомым местам без всяких дополнительных движений.
Ну и красиво, всё таки сделано.
chrome
Ещё фишка - можно превратить некоторые часто используемые сайты, например gmail или google reader в подобие обычных desktop приложений(без дополнительных элементов интерфейса типа строки URL), и запускать их, например, из панели быстрого запуска:
googlereader
Скриншоты других возможностей Chrome и более подробный  анализ можно найти на хабре.

вторник, сентября 02, 2008

Новый браузер Google Chrome



chrome-logo
Google сегодня вечером обещает выложить свой новый браузер Chrome для скачивания. А пока они выложили комиксы про его возможности, а также технологию его разработки и архитектуру. Видимо, в Google работают любители японской манги. Надо сказать, мне такой подход нравится, всё гораздо нагляднее, чем если бы это было описано в длинном тексте.
chrome-ui
Обещают, что он будет стабильным, быстрым, безопасным, с простым интерфейсом, с открытими исходниками. Скорость, насколько я понял, будет обеспечена за счёт того, что браузер все задачи будет распараллеливать не просто в отдельных thread’ах, у каждой задачи будет свой собственный процесс. Из-за этого же обещано, что если при отрисовке страницы возникает unhandled exception (в смысле неустранимая ошибка приложения), то гибнет не весь браузер, а только одна вкладка в нём - firefox, допустим, весь закрывается в таких случаях, со всеми открытыми страницами.
chrome-multiprocess
Как в операционной системе, в Chrome будет собственный task manager, можно посмотреть какой сайт или плагин сжирает ресурсы процессора и если что прибить его.
Ещё обещано скоростное выполнение javascript’овских программ за счёт переписанной с нуля виртуальной машины со скоростной сборкой мусора.
Что касается пользовательского интерфейса, каждая вкладка будет иметь свой собственный. Еще полезная фишка - относительно приватности. Для отдельной вкладки можно включить режим инкогнито -тогда всё, что в ней происходит не будет записано в логи браузера, все куки после закрытия страницы также будут удалены.
chrome-ui2
P.S. Русский перевод комикса - часть 1часть 2. А скачать браузер можно отсюда -http://www.google.com/chrome

пятница, августа 29, 2008

Стиль оформления C++ кода от Google

Я ненавижу можно сказать с моего программистского детства неряшливо оформленный код, в котором нет нормальных отступов, на одной строке куча операторов, нет единого стиля кода по всему проекту… ну в общем вы поняли. В своё время у меня много времени отнимало приведение в божеский вид работы безвестных индийских программистов. Так что, IMHO, существование в фирме, занимающейся выпуском ПО code style guide (которого ещё и придерживаются все разработчики)  оказывает значительное влияние на успех или провал всего проекта, ну как минимум существенно влияет на время разработки.


Одного существования в фирме этого документа, конечно, мало… В некоторых конторах style guide существует, но на него все по большому счёту забивают. Так что нужны регулярные тренинги, на которых о его существовании и содержании рассказывают сотрудникам.


Обнаружил благодаря хабрахабру code style guide от Google, и с интересом сейчас его читаю. Много для себя полезного нашёл.

понедельник, августа 18, 2008

Web 2.0 сервисы для совместной работы


Продолжаю исследовать западные web 2.0 сайты. В прошлых сериях - сервисы социальных новостей и топ 20 web 2.0 сайтов по траффику. На этот раз обзор популярных средств для групповой работы. Некоторые из этих сервисов ориентированы на бизнес-аудиторию, и не являются бесплатными.
  • PBWiki - предоставляет площадку для размещения собственного частного wiki-образного контента. Для образовательных учреждений - бесплатно, для коммерческого использования - бесплатно только для 3-х пользователей, за каждого следующего нужно платить от $4-х до $8 в месяц. За пользователей, не обладающих правами править статьи нужно платить только 10% от этой суммы. Отличается простотой в использовании. Видимо, некоторым фирмам дешевле платить им, чем разворачивать собственный интранет.
  • Wikia - бесплатная альтернатива. Каждый желающий может организовать здесь wiki проект. Это подходит в основном для некоммерческого использования, поскольку тут нет ограничения доступа случайных людей и есть реклама. Подходит для фанатов игр или сериалов, например смотрите вики по вселенной Звёздных войн, в которой в данный момент около 59 тыс. статей.
  • Chatzy - сервис для создания собственных приватных или публичных чатов. В отличии от всевозможных мессенджеров не требует установки ПО на компьютер. При создании чата рассылаются приглашения по потенциальным участникам е-майлу, также возможно разместить ссылку на чат к примеру на своём сайте.
  • Про Meebo я уже написал в прошлом посте - это сервис для тех, кто хочет воспользоваться ICQ, jabber, google-talk и т.д. с чужого компьютера или из-за блокирующего файервола.
  • Bubbl.us - сервис для совместного создания карт памяти AKA mind maps. Можно проводить мозговые штурмы в режиме онлайн.
  • Twiddla - графический чат. Пользователи могут совместно рисовать или чертить в браузере. Ещё одно из средств для мозгового штурма в режиме онлайн.
  • Google docsgoogle calendar - средства для личного и/или совместного создания документов и расписаний.

суббота, августа 16, 2008

Top 20 американских web 2.0 сервисов


Предыдущий пост был о западных web 2.0 сервисах, а именно о сайтах социальных новостей.
Недавно компания Hitwise провела исследование, в котором определила 20 самых популярных в США web 2.0 сервисов. Самыми популярными, что не удивительно, являются социальные сети, которые в данный момент мне не очень интересны - myspace, facebook, и т.п. Digg, к моему удивлению, сюда не попал.

1. MySpace — 44.14% market share, социальная сеть, чрезвычайно популярная в Америке, но русская версия пока не сумела победить наших одноклассников и в контакте.
2. eBay — 16.22% market share, он-лайн аукцион. Вещь, конечно, хорошая, но надо с paypal’ом помучаться.
3. Facebook — 13.03% market share, социальная сеть.
4. YouTube — 9.88% market share, хранилище видео-роликов обо всём на свете
5. Wikipedia — 4.76% market share, онлайн-энциклопедия, создаваемая пользователями
6. Craigslist — 3.14% market share, газета электронных объявлений, привязанных к конкретным городам. Для России есть доски объявлений только для Москвы и Петербурга.
7. Yahoo Answers — 1.41% market share, сервис вопросов и ответов.
8. myYearbook — 1.05% market share, социальная сеть американских тинейджеров
9. Tagged — 0.95% market share, ещё одна социальная сеть для школьников и студентов
10. Flickr — 0.86% market share, фотохостинг
11. Bebo — 0.71% market share, социальная сеть
12. Meebo — 0.59% market share, веб-ориентированный клиент для обмена мгновенными сообщениями, в частности, полезная вещь для тех у кого аська на работе заблокирована файерволом.
13. BlackPlanet.com — 0.52% market share, социальная сеть для американских негров
14. GaiaOnline.com — 0.45% market share, социальная сеть для анимешников
15. Blogger — 0.40% market share, блогохостинг от Google, на котором жил в частности мой блог до тех пор, пока не переехал сюда.
16. Adam4Adam — 0.35% market share, социальная сеть для американских гомосексуалистов
17. hi5 — 0.35% market share, ещё одна социальная сеть
18. WikiAnswers — 0.33% market share, сервис вопросов и ответов, построенных на технологии вики.
19. IMEEM — 0.31% market share, социальная сеть, специализирующаяся на мультимедиа-контенте, видео, музыке и т.п.
20. LiveJournal — 0.30% market share, ЖЖ - вряд ли кто-то не в курсе, что это такое.

В общем среди всего этого разнообразия меня заинтересовали сервисы вопросов и ответов, ну и meebo - иногда полезная вещь. Жалко, не знал об этом на предыдущей работе, сейчас это менее актуально. Wikipedia, Youtube и Flickr, само собой.

четверг, августа 14, 2008

Популярные западные web2.0ные проекты


Примерно полгода назад я написал 2 поста о неавтоматизированном data-mining (второй пост тут), личной системе нахождения, систематизации, обработки и использования данных из интернета. Но перед тем как информацию систематизировать, её надо найти. А для этого нужно представлять, как и где искать. В последние годы сервисы с создаваемым пользователями контентом (web 2.0 сервисы) становятся всё популярнее и полезнее в этом плане. В рунете их много, но рунет - это всего лишь маленькая часть всего интернета, основные события происходят всё же за его пределами.
Решил ознакомиться с ситуацией в англоязычном интернете, ну и по ходу дела пост или несколько постов написать по этому поводу. Многие жители рунета, даже знающие английский, не в курсе того, что там происходит. Краткий обзор наиболее  популярных не-рунетовских web2.0 сервисов:
  • Digg.com - сервис социальных новостей. Русские аналоги - news2.ru, в какой-то степени habrahabr.ru. Различие - в посещаемости (на digg’е зарегистрировано больше полумиллиона пользователей, а просто посещают более миллиона в день). Горячие новости с первой страницы мгновенно обрастают сотнями комментариев, благодаря которым можно по этой теме найти много дополнительной информации. Впрочем, в большом количестве пользователей кроме плюсов есть и минусы - каждый час там создают несколько десятков страниц, заполненных ссылками. Так что для эффективного использования этого сервиса необходимо настроить систему фильтров, чтобы видеть только новости на интересующую тебя тему. На хабрахабре я нашёл интересную статью со сравнением хабра с digg’ом.

  • Reddit.com - также сервис социальных новостей. Несколько менее популярный, чем digg, и опять же, из этого проистекают и его плюсы - новости дольше находятся на странице “новых новостей”. Кроме того, для того, чтобы уменьшить влияние внутрисайтовской мафии (которая очень сильна на digg’е, к примеру) в течение первого часа после опубликования новости reddit не показывает количество проголосовавших за или против, позволяя пользователям более объективно её оценить.

  • Slashdot.org- всё ещё работающий предок первых двух сервисов. Сайту уже более 10 лет, первая версия была создана ещё в 1997. По контенту он ближе к habrahabr.ru, то есть ориентирован прежде всего на IT-шную публику. Аудитория, согласно википедии - примерно 5,5 млн пользователей в месяц. Первоначально, аудитория состояла из линуксоидов и прочих опен-сорсников, но к настоящему моменту охват стал шире.



Продолжение следует…  

P.S.
Последние несколько недель в связи с международной обстановкой я пристрастился к чтению новостей на digg’e и reddit’е и с удивлением обнаружил, что судя по комментариям - это прямо таки либеральный оплот борьбы с американскими нео-консерваторами и их политикой.

суббота, августа 09, 2008

Переезжаю на собственный домен

Блог в процессе переезда на wordpress'овский движок.
Отныне он будет находится по адресу computerthings.ru
Пока переходный период возможны всякие глюки.

четверг, августа 07, 2008

Популярно о подкастах

Я не настоящий гик, поскольку информация о многих популярных сервисах, программах, технологиях доходила до меня с большой задержкой. Но почему я злой был - потому что у меня велосипеда не было. Но постепенно я начинаю меняться, особенно с того момента, как интернет у меня дома стал более широким (всё равно, правда, не настоящий анлим, после 2,5 Гб в месяц снижают скорость со 128 до 32 Кб, но хоть что-то). Можно пользоваться в ограниченных количествах torrent'ами, видео смотреть на youtube и т.п. вещи. Нижний всё же провинция в этом плане до сих пор.

podcasts_icon Вот. И по этому поводу у меня наконец-то дошли руки до такого явления, как подкасты. Поскольку гиков даже в развитых странах всего 7%, то я думаю, что ничего страшного, если я про это напишу, всё равно не все знают о таком явлении, вдруг для кого-то открытием станет :)

Подкасты - это аудио-файлы (обычно mp3) распространяемые с помощью подписки на RSS или Atom поток, предназначенные для прослушивания на mp3-плеерах и компьютерах. Обычно похожи на радио передачи определённой тематики, которая зависит от авторов подкаста. Слово "подкаст" происходит от комбинации слов iPod и broadcasting, соответственно, в своё время популярность это явление приобрело благодаря Apple'овским iPod'ам. В виду дешевизны технологии заниматься записью подкастов вполне можно в домашних условиях, достаточно приобрести хороший микрофон и поставить несколько бесплатных программ. В отличие от интернет-радиостанций, вещающих в прямом эфире, тут все в записи, со всеми плюсами и минусами этого.

Для того, чтобы следить за подкастом и выкачивать его себе на компьютер используются различные программы: классикой жанра является iTunes, также есть альтернативы - JuiceDoppler.

Для России и ближнего зарубежья самым популярным порталом для подкастов является rpod.ru, хотя по интерфейсу мне больше нравится podfm.ru. На подобных порталах подкастеры выкладывают свои творения, обычно под определённой рубрикой - IT и компьютеры, Авто, Аудиокниги, Бизнес, Мужчина и Женщина, Музыка, Новости, Спорт, Юмор и т.д. Помимо чисто любительских проектов (хотя и среди них встречаются шедевры) в последнее время этим занялись многие издательства, журналы и т.п. публика. Те, кто подкастингом занимается серьёзно, обычно со временем переходят на свои платные площадки, насколько я знаю в wordpress'е есть для этого плагин.

Несколько примеров, что тут можно найти:
Кстати, по другую сторону океана всё, конечно, намного более развито. Одна из лежащих на поверхности идей - использовать их подкасты для изучения языка (например, рекомендуюwww.businessenglishpod.com). Популярные англоязычные подкаст-порталы:
Что еще почитать на эту тему:

среда, августа 06, 2008

Процесс разработки программного обеспечения

На моей предыдущей работе был очень детализированный процесс внесения изменений в код, никто не мог просто исправить свой или чужой баг и внести изменения в код. Нужно было следовать определённому процессу, а именно создать в специальной базе данных CR - change request, в котором описать проблему, методы воспроизведения бага, версию ПО, на котором баг воспроизводится и т.п. Затем, после того, как этот CR просмотрит специально обученный человек, который принимает решение, стоит ли овчинка выделки, надо эту ошибку исправлять или нет, а если надо, то с какой срочностью, CR назначался на определённого человека, который уже должен исправить эту ошибку. Этот человек может быть, а может и не быть тот, кто создал описание этого бага.

Далее, если эту CR назначили на тебя, ты исправляешь баг, затем, когда ты уверен, что всё сделал, перед тем как вносить эти изменения в общее хранилище кода (в систему контроля версий ) назначаетсяформальная инспекция, на которую ты обязан позвать нескольких человек, как правило 2-3-х, обычно своих ближайших коллег, чтобы они просмотрели твои изменения с помощью Diff-tool'а (конкретно там использовался Araxis Merge, хотя вообще таких программ много, в том числе неплохой бесплатныйWinMerge, которым я пользуюсь в настоящий момент). Это вообще-то весьма полезная практика, обычно другие люди видят в твоём коде то, на что у тебя уже замылен взгляд. По результатам инспекции в описание CR вносятся все найденные ошибки, недочёты, проблемы и т.д, найденные в её ходе, причём если их 0, то есть ничего не найдено, то считается, что инспекция проведена некачественно, так что для всех лучше, если хоть что-нибудь найдут и опишут. Дальше разработчик проводит работу над ошибками, правит свои изменения, и процесс повторяется, в случае серьёзных изменений назначает новую инспекцию.

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

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

вторник, августа 05, 2008

Хороший ресурс для программистов с бесплатными книгами

Наткнулся недавно на сайт с бесплатными книгами по программированию (на английском). Точнее, не с самими книгами, а с ссылками, где их можно взять. Кроме книг там можно найти ещё много всего вкусного, например, мне понравились шпаргалки по Perl'у и по Ruby:
  • Ruby QuickRef
  • Perl QuickRef (тоже самое в PDF)  - эту книжку из 31 страницы продают в магазинах, но как то жалко покупать, поскольку информации мало. Но для того, чтобы освежить память или как справочник иногда полезно. На этом же сайте есть 1-2-х страничные шпаргалки по регулярным выражениям, можно распечатать и повесить перед носом.
На сайте есть ссылки на книги по Ajax, по C#, по Java (в том числе по J2EE), по PHP, поRuby, по Perl'у, по шаблонам проектирования (design patterns) - ну там примеры только по J2EE отчего-то, по шаблонам я другой сайт нашёл, http://sourcemaking.com/, он куда круче. Также есть книги по алгоритмам и структурам данных и по объектно-ориентированному программированию.

Желающим учить PHP и обладающим знанием английского и толстым интернетом можно посоветовать онлайн видео с youtube.com PHP Tutorials. Я, правда не смотрел, судя по всему это коллекция мини уроков минут по 5 каждый с обзором основных конструкций языка. Есть люди, органически не желающие учиться, читая книги, судя по всему для них это выход :) Я думаю, если поискать на youtube можно и по другим языкам что-то похожее найти.

А кроме youtube есть и более специализированные ресурсы онлайн-видео, например http://skillopedia.ru/, на который выкладывают видео уроки по разным областям, в том числе по IT. Например, я нашёл там уроки по C++, PHP и MySQL.

четверг, июля 31, 2008

Рейтинг языков программирования


Есть много методик для измерения популярности языков программирования, в основном при помощи сопоставления популярности соответствующих запросов в поисковых машинах. Один из самых известных рейтингов составляет TIOBE, ежемесячно публикующая такую статистику и графики её изменения за несколько последних лет :

Это у буржуев. Основные заслуженные  языки программирования Java, C/C++ потихоньку уступают позиции относительно новым языкам типа PHP, Ruby, Python'а, C#, хотя всё равно лидируют с заметным отрывом. Visual Basic оказывается не сдаётся, даже несколько прибавил, что в принципе понятно, по сравнению с c++ сваять  на нём простое windows приложение гораздо быстрее и проще, а часто большего и не требуется. PHP давно обогнал perl - тоже из-за простоты изучения. На perl'е можно всё гораздо компактнее написать, конечно, очень мощный и удобный язык для написания разных скриптов, но php проще в изучении и исходники нагляднее, и по этим причинам выигрывает битву за умы web-программистов :)

Кстати, благодаря этому рейтингу обратил внимание на взлёт популярности нового микрософтовского скриптового языка для автоматизации системных задач - Power Shell, который пришёл на замену старому языку .bat файлов и msdos'овских команд. Надо будет ознакомиться, поскольку .bat файлы мне время от времени приходится писать, и часто правда нельзя обойтись только их "языком", не хватает функциональности, приходится скрипты на перле писать. Полез искать ресурсы по нему, наткнулся на неплохой блог про Power Shell на русском с примерами скриптов на нём.

Попробовал собственное исследование провести, как дела в рунете обстоят с языками программирования. Зашёл на яндексовский сервер http://wordstat.yandex.ru, показывающий частоту запросов к яндексу, и повводил названия языков программирования. Правда с C/C++/C# облом случился, яндекс похоже + и # отбрасывает, так что статистику собрать не удалось, и их я из таблицы выбросил. Получилась такая картина:

Ещё раз напоминаю, тут не учтены C/C++/C#, да и методика не слишком хороша (php и java часто ищут не с целью узнать о языках программирования, а с целью скачать готовые продукты, java игры или php guestbook), но всё же определённое представление эта картинка даёт. У нас, к примеру, всё ещё популярен Delphi, гораздо сильнее, чем Visual Basic.

Ещё один подход к оценке популярности языков - по количеству вакансий. Например, тут. Автор блога приводит статистику по количеству вакансий программистов на разных языках в Белоруссии. И тут. Тоже интересный метод, даже более полезный чем по количеству запросов.

среда, июля 30, 2008

Недавно обнаружил из-за чего мой блог не работал в IE6


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

Кнопка конечно офигительно полезная, но видимо не совсем совместимая со старыми браузерами. В опере работет, в Firefox'е работает, даже в IE7 работает, а в IE6 на работе (тут корпоративная политика такая, интранет работает только в IE6) отчего то воспринимает sindicollo.blogspot.com не как блог, а как ссылку на исполняемый код этой кнопки, короче блог не грузился совершенно. Поскольку я этим броузером не пользовался, я и внимания на это не обращал.

В общем, стёр я её как не оправдавшую доверия.


P.S. Или забить на IE6... Он похоже вообще на все скрипты неадекватно реагирует, на рекламу блогов через feedmates тоже. Скорее всего это настройки безопасности в нём виноваты, если с ними поиграться, и разрешить загружать всё, то сайт грузится. Если кто-нибудь из тех, кто это читает, испытывает проблемы с загрузкой сайта, напишите, ладно?