25 декабря 2008 г.

Про IE

Открываю новую вкладку в IE7. По умолчанию стоит about:blank. Появляется новая вкладка, но работать с IE еще нельзя — довольно долго смотрю на красивое крутящееся колечко и надпись "Подключение..." За это время успеваю налить в кружку чай и поматериться на разработчиков.

Я не понимаю, почему нужно тратить столько времени на открытие пустой вкладки. Какое, нафиг, подключение? Куда? К about:blank? Я действительно не понимаю.

23 декабря 2008 г.

Ой, держите меня...

CNews — хороший портал, и с каждым днем он мне нравится все больше и больше.

Итак, отличная новость — Минкомсвязи придумало как спасти ИТ-индустрию.
В прошлую пятницу 19 декабря стало известно, что Минкомсвязи направило в Минфин и Минэкономразвития новую редакцию Федеральной целевой программы «Электронная Россия». Сегодня в Минкомсвязи прокомментировали ее специально для CNews (текст заявления приводится целиком и без изменений):

«В Минкомсвязи рассчитывают использовать «Электронную Россию» для спасения IT-индустрии. Запущенная в 2002 году как чиновничья инициатива сверху, программа должна наконец сработать на благо отрасли.

Биоритм отрас… полный текст

Источник: CNews



Ура! Наконец-то нашелся кто-то (ну, хоть кто-то!), кто не побоялся кризиса и решил спасти российскую ИТ-индустрию. Потому, что "программа должна наконец сработать на благо отрасли". Краткий алгоритм успеха: 1) сменить название госпроекта на более умное; 2) закупать мозги вместо оборудования; 3) пожаловаться на недофинансирование. Всё! ИТ-индустрия, считай, спасена. (вытираю с лица слезы умиления и сопли счастья)

Нет, это нужно читать. Что не фраза, то просто перл! Можно прям выдирать из текста и на стенку вешать. Самое интересное, что сквозь смех и слезы, все равно появляются новые вопросы...

Вот избранные цитаты.

...если ранее «Электронная Россия» была ориентирована, в основном, на закупку «железа» для страны, то теперь в центре внимания разработчиков – «мозги». А для спасения мозгов для отрасли нужны госконтракты по ФЦП.

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

«Смарт»-версия «Электронной России» разработана с учетом консультаций...

Эээээ... Простите, а раньше какая была? Dumb?

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

Ой.

За семь лет, и особенно за последние несколько месяцев кризиса, пришло понимание, какой смысл можно вкладывать в понятие «Электронное правительство», и как оно может помочь непосредственно гражданам.

Ну, спасибо кризису. Иначе бы и не дождаться нам, смертным...

Невысокий процент исполнения программы в Минкомсвязи объяснили недофинансированием...

Ребят, а если подключится к тарифному плану "Анлим" - тогда хватит?

Ну, и напоследок:
Формулировки предыдущей концепции были настолько общими, что многие ведомства использовали ФЦП просто для прокладки оптических линий связи... Конкретизировав мероприятия, мы постарались уйти от ставки на «железо» и «веревки», теперь мы создаем полноценный информационный продукт».

Кто не спрятался, то Минкомсвязи не виноват. Щас они продукт делать будут.

15 декабря 2008 г.

Цитата: Кериевски

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

Недавно мне порекомендовали книгу Джошуа Кериевски "Рефакторинг с использованием шаблонов". Очень понравилась. Толковый мужик, знает, о чем пишет. Как бы заполняет нишу между "Рефакторингом" Фаулера и "Шаблонами проектирования" Гаммы и его друзей.

Я позволю себе процитировать:
Если вы хотите повысить квалификацию разработчика, изучение эволюции программных проектов будет более ценно, чем изучение проектов самих по себе — ибо настоящая мудрость лежит в развитии.


Книга, к тому же, издается за подписью Фаулера.

10 декабря 2008 г.

Слияние отсортированных массивов

Даны M отсортированных массивов по N элементов каждый. Необходимо слить их в одну отсортированную последовательность.

Есть несколько способов сделать это.

Первый способ - сливать сортированные последовательности по несколько штук (например, по две) до тех пор, пока не останется одна. Это и будет искомая последовательность. Например, для М=4, есть массивы М1, М2, М3 и М4 длиной по N элементов. На первом шаге сливаем M1 и М2, а потом М3 и М4. Получим два массива М5 и М6 длиной по 2*N элементов. На втором шаге сливаем М5 и М6 и получаем искомую последовательность длиной 4*N.

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

Вопрос в том, какой из способов более эффективный?

Можно попытаться посчитать приблизительное количество операций сравнения. Для простоты примем, что количество исходных массивов является степенью 2, то есть 2,4,8,... Для первого способа количество операций сравнения будет равно N*M*2*log2M. А для второго - N*M2.

Видно, что для М=2 или 4 количество операций будет одинаковое для обоих способов. А вот дальше количество операций для первого начнет уменьшаться. При М=32 соотношение количества операций будет примерно 1/3 в пользу первого способа.

Однако, все это верно, если проводить все слияние в памяти. Если же предположить, что памяти достаточно на одновременное размещение только части массивов, то дело принимает совсем другой оборот.

Предположим, что памяти хватает только на обработку пары массивов. Следовательно, после обработки каждой пары массивов на любом шаге слияния, нам нужно сохранять на диск промежуточную последовательность, чтобы считывать ее на следующем шаге слияния. То есть, используя пример, нужно считать последовательности М1 и М2 и записать последовательность М5. Затем считать М3 и М4 и записать последовательность М6. Затем считать М5 и М6 и записать результирующий массив.

Если попробовать подсчитать, то получится, что на каждом шаге нужно считать М*N элементов и записать М*N элементов. При увеличении М количество шагов растет - K=log2M. То есть количество операций чтения/записи будет равно 2*M*N*log2M. А используя второй способ нужно считать и записать только 2*М*N элементов (потому, что для второго способа нужен только один шаг).

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

9 декабря 2008 г.

Освобождение памяти в std::vector

Я почему-то раньше был уверен, что выделенную память в std::vector можно освободить присваиванием:

typedef vector<int> int_vector;

int_vector v;
v.resize(10);
...
v = int_vector();

Оказалось, ошибался. Так не освобождает. По крайней мере, стандарт не обязывает.

Следовательно, остался только один способ освободить память — с помощью vector::swap:

int_vector().swap(v);


(способ описан в "Эффективном использовании STL" Скотта Мейерса)

5 декабря 2008 г.

Задачи на собеседованиях: шаблоны проектирования

Вот такие вопросы еще задают на знание паттернов проектирования.

Описать недостатки паттерна singleton. Предложить решения устранения недостатков.

20 ноября 2008 г.

Государство искренне выделяет деньги

Для тех, кто еще не знает, куда и как деваются деньги, выделяемые на различные госпроекты, очень рекомендую:

http://expert.ru/articles/2008/11/14/privalov_uskova_video/

Это интервью президента Национальной ассоциации инноваций и развития информационных технологий (НАИРИТ) Ольги Усковой. Никаких проблем, конечно, не в этом интервью не решают, но зато оччень познавательно...

18 ноября 2008 г.

...В наношоколаде

Не успел, понимаешь, наш президент высказать вслух свое огорчение по поводу того, что, мол, не осваиваются деньги, выделенные на нанотехнологии, как главный нанотехнолог страны Чубайс заверил, что очень даже осваиваются. Более того, Роснано сейчас "в шоколаде". Видимо, речь идет про наношоколад.
специалисты "Роснано" до наступления кризиса успели эффективно разместить предоставленные корпорации 130 миллиардов рублей из российского бюджета. "Мы даже нарастили объем до 134-х, даже чуть уже больше - почти 135-и миллиардов рублей..."

Эт что они там, наноденьги делают с помощью нанотехнологий? Или фигней занимаются, вместо дела?

20 октября 2008 г.

GCC и precision loss

В процессе портирования нашего линуксового проекта на Windows обнаружилась интересная вещь: наш компилятор GCC не умеет распознавать ситуации с присвоением из long в short и им подобные. То есть, распознавать, скорее всего, умеет, а вот сообщать о них — нет.

Вот простой пример:

int main (int argc, char **argv)
{
  unsigned long a = 0xFFFFFFFE;
  unsigned char b = a + 1;
  return 0;
}

Я, честно говоря, был немало удивлен. Специально этим вопросом не занимался, но был уверен, что такие ситуации GCC отслеживать умеет. Ан нет... Что самое интересное, большинство моих знакомых гуру тоже были в этом уверены. В нашем проекте, как и во многих других, известных мне проектах, используется GCC 4.1.2, некоторые используют 4.2. Вроде бы есть опция -Wconversion, но работает она только для fixed и floating point. В общем, подстава.

Думаю, что о важности такого предупреждения говорить не нужно. В MSVC++ эта ситуация легко отслеживается включением третьего уровня предупреждений — /W3. После портирования нашего проекта на MSVC++, мы смогли легко локализовать и исправить несколько ошибок, связанных как раз с некорректным преобразованием типов.

Но самое интересное не в этом. После длительного изучения документации по GCC, все-таки нашел :)

Итак, не прошло и 25 лет, как разработчики GCC все таки прониклись пользой отслеживания размерности типов. Начиная с версии 4.3 (первый релиз вышел в марте 2008 года, то есть, всего полгода назад) GCC умеет распознавать и сообщать о ситуациях с присваиманием из long в char и им подобных.

Опция -Wconversion, которая работала только для fixed и floating point теперь разделена на две опции -Wtraditional-conversion и -Wconversion. Подробности можно почитать здесь http://gcc.gnu.org/wiki/NewWconversion

Я проверил — на приведенный пример ругается "warning: conversion to ‘short unsigned int’ from ‘long unsigned int’ may alter its value". Аллелуйа!

Ура, товарищи! Даешь новые версии! Даешь новые баги! :)

8 октября 2008 г.

Задачи на собеседованиях: наследование в C++

Очередной вопрос с собеседования, который часто спрашивают.

У нас есть некая иерархия классов. Нам нужно запретить наследование от какого-то класса. В Java для этого есть специальное ключевое слово final, но в C++ такого слова нет. Попытка наследования от финального класса должна пресекаться на этапе компиляции.

15 сентября 2008 г.

Javascript: "option" object и IE

Простой скриптик. Берет все input-элементы с именем "hiddenlist" и заносит их в выпадающий список "selectlist". Отображаться в списке должно значение value, а на сервер отсылаться значение id. В Firefox работает, а в Internet Explorer 7 — нет.

var elems = document.getElementsByName("hiddenlist");

var selectobj = document.getElementById("selectlist");
removeAllChildren(selectobj);

for (i = 0; i < elems.length; ++i) {   var optobj = document.createElement("option");   optobj.value = elems[i].id;   optobj.text = elems[i].value;   selectobj.appendChild(optobj); }

Почему-то в IE после вызова appendObject(optobj) поле text очищается, или просто игнорируется. А поле optobj.value обрабатывается нормально. В результате в IE после вызова скрипта имею список из N пустых строк, но при этом на сервер отсылаются правильные значения.

Пришлось сделать так:

for (i = 0; i < elems.length; ++i) {   selectobj.appendChild(document.createElement("option"));   selectobj.options[i].value = elems[i].id;   selectobj.options[i].text = elems[i].value; }

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

12 сентября 2008 г.

Exceptions и Visual C++

Недавно понадобилось собрать STL-проект на Visual C++ 2008 без использования исключений.

Почитал мануал по компилятору, долго игрался с настройками проекта и ключами /EHsc... Что-то никак не получается отключить исключения.

Наконец, залез в код STL и обнаружил там некий волшебный макрос _HAS_EXCEPTIONS. Добавление в опции компиляции ключа -D_HAS_EXCEPTIONS=0 привело к нужному результату — исключения в STL отключились.

Припоминаю, что лет шесть назад пытался решить эту же задачу для Visual C++ 6.0. И решалась она абсолютно таким же способом, через _HAS_EXCEPTIONS. Вот я и думаю, то ли Microsoft что-то перемудрил с Visual C++, то ли я его "готовить" не умею?..

С праздником вас, дорогие коллеги! С днем программиста! :)

Updated: Если нужно линковаться с msvcrt.lib или msvcrtd.lib (опции компилятора /MD или /MDd), то нужно определить еще один макрос:
#define _STATIC_CPPLIB

Updated: Вот интересная статья в тему http://ccollomb.free.fr/blog/?p=34

2 сентября 2008 г.

Задачи на собеседованиях: графы

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

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

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

3 июля 2008 г.

Как сменить shell

Тема не новая, но вот сегодня опять занимался решением старых проблем...

Не знаю кому как, но лично я считаю, что лучший shell — это bash. Не буду перечислять все преимущества, но одно просто неоспоримое — привык я к нему :) Я вообще люблю консоль, но bash — особенно. Он какой-то уютный, что ли.

Но вот сегодня захожу на очередной удаленный сервер по ssh и попадаю в ненавистный мне tcsh. Всё б ничего и можно потерпеть, но хочется уюта :) Но я здесь не root, и мне особо не рады. Что делать?

Исправляется довольно просто: нужно прописать смену shell в настроечном файле, который считывается при логине. Для tcsh этот файл называется .login и находиться должен в моей домашней папке. Если его нет, то нужно создать и прописать в нем следующее:

if (-f /bin/bash) then
  setenv SHELL /bin/bash
  exec /bin/bash --login
end if

Эти строки заменяют существующий shell, загружаемый по умолчанию, на bash. В данном случае по умолчанию был установлен tcsh.

В случае другого shell решение немного изменится. Например, если по умолчанию загружается sh, то никакой .login не поможет — sh просто не знает о существовании такого файла. Для sh нужно исправлять файл .profile (он тоже должен находиться в домашней папке):

if [ $SHELL = "/bin/sh" ]; then
  if [ -f /usr/bin/bash ]; then
    SHELL=/usr/bin/bash
    export SHELL
    exec /usr/bin/bash --login
  fi
fi

Маленький нюанс здесь — bash тоже считывает .profile и двойной if нужен здесь для того, чтобы исключить вероятность бесконечной рекурсии при загрузке bash.

Полный список соответствия разных shell'ов и настроечных файлов можно почитать здесь.

20 июня 2008 г.

Show it to developers ;-)



Взято отсюда.

16 июня 2008 г.

Блокирующие вызовы и ошибка EINTR

Недавно столкнулся с ошибкой, связанной с неправильной обработкой возвращаемого значения функции sem_wait().

Функция sem_wait() уменьшает текущее значение семафора на 1. Если прежнее значение семафора было 0, то поток, выполняющий функцию sem_wait, блокируется до изменения значения семафора. При успешном выполнении — функция возвращает 0; при ошибке — вернет -1, а errno будет содержать код ошибки.

Вот пример неправильной обработки возвращаемого значения:

int res = sem_wait(&sem);
if (0 != res)
{
  // Ошибка!
  // Сообщаем об ошибке и выходим.
  ...
  return;
}

// Ошибки нет - продолжаем работу.
...


Что здесь неправильно? Дело в том, что функция sem_wait() является блокирующим системным вызовом. Поэтому выполнение этой функции может быть прервано, если выполняющийся поток получит какой-нибудь сигнал (например, сигнал о завершении другого потока). В этом случае функция вернет -1, а errno будет равна EINTR.

При этом никакой ошибки на самом деле нет, это просто способ дать программе обработать пришедший сигнал. Это необходимо учитывать, и вызов sem_wait() лучше всего делать в цикле. Например, таком:

int res;
do
{
  res = sem_wait(&sem);
}
while (0 != res && EINTR == errno);

if (0 != res)
{
  // Ошибка!
  // Сообщаем об ошибке и выходим.
  ...
  return;
}

// Ошибки нет - продолжаем работу.
...

Это касается и других блокирующих функций. Например, select, wait, waitpid и др. Возможность прерывания функции с ошибкой EINTR обычно описана в man'е.

20 мая 2008 г.

Ошибки кодирования

Очередной багфиксинг показал, что за 30 лет мало что изменилось :)

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

И вот, модуль логгирования вдруг стал время от времени "падать" в совершенно непредсказуемые моменты. Оказалось, что виноват в этом один из компонентов, который вместо осмысленного текста посылает в модуль логгирования мусор. У компонента проблема, но почему модуль-то падает?..

Ошибка стара, как Си :) Разработчик модуля логгирования реализовал функцию примерно так:

void logMessage (const char *str)
{
  printf(str);
}

Видно ошибку? Проблема тут в том, что текст сообщения напрямую подается в функцию printf, минуя использование форматных строк типа "%s\n". Если подавать на вход функции осмысленный текст, то все будет хорошо, до тех пор пока в тексте сообщения не встретится "%s". В этом случае функция printf попытается сформировать новую строку, предполагая, что в стеке находятся дополнителльные аргументы. А аргументов-то там и нет. Вот тут-то printf и упадет с большой долей вероятности (скорее всего это произойдет, когда printf попытается вызвать strlen для значения, которое достанет из стека).

В нашем случае на вход функции подавался случайный мусор, поэтому время от времени в нем встречалась последовательность "%s", и модуль вываливался с ошибкой Segmentation fault.

Вот правильное использование printf для нашей функции логгирования:

void logMessage (const char *str)
{
  printf("%s", str);
}

Вызов printf и ей подобных должен выглядеть именно так и никак иначе.

Читать об уязвимостях printf.

Технологии мчатся вперед, а ошибки не меняются :)

15 апреля 2008 г.

Что курят на Фонтанке?

или как повысить посещаемость


Черные червы, красные пики.
"Шоссе 60"



Фонтанка.ру вчера опубликовала "сногсшибательную" новость о том, что Россвязьохранкультура требует регистрации аппаратуры Wi-Fi для домашних пользователей:

В ответе на запрос журналиста «Фонтанки» заместитель начальника Управления контроля и надзора в сфере связи Владимир Краснов заявил, что владельцу радиоэлектронных средств технологии Wi-Fi необходимо получить разрешениена использование радиочастотного спектра, а также зарегистрировать оборудование. Речь идет о регистрации как хотспотов, так и домашних маршрутизаторов и встроенных в ноутбуки, смартфоны и КПК приемо-передающих устройств.


Ну и дальше в том же духе. Какой ужас! Что же мы теперь делать будем?! Куда катится мир? Куда смотрит правительство? Эй, правительство!..

Честно говоря, у меня только два варианта — или статья была написана специально для повышения посещаемости и увеличения количества ссылок на Фонтанку.ру, или журналист Нетупский просто полный кретин.

Да, а из-за чего весь шум-то? А? Ах, письмо... Ну, давайте почитаем. Вот оно, это письмо. Для тех, кто не умеет читать стандартные бюрократические письма, я могу перевести на наш, человеческий язык:

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

Короче, в письме ясно сказано — подлежит регистрации в соответствии с правилами. А правила гласят, что регистрировать не надо. Вот и всё. Какие проблемы? А народ ведь всерьез обсуждает...

З.Ы. Вот и я на Фонтанку ссылку поставил :)

З.Ы.2. Помню не так давно на той же Фонтанке видел новость "Российские фигуристы убились ап лед". Так все-таки, что они курят? :)

16 марта 2008 г.

Проблема импорта в Mozilla Thunderbird

Столкнулся сегодня с проблемой импорта почтовых сообщений из Microsoft Outlook в Mozilla Thunderbird 2.0.0.12.

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

Поиск в сети ничего не дал. С подобной проблемой люди уже сталкивались, но все эти проблемы относятся к версиям Thunderbird не выше 1.5 и связаны с тем, что старые версии Thunderbird очень плохо относились к именам временных папок которые содержали пробелы. Это не мой случай, потому что изменение имени временной папки ничего не дало — проблема осталась.

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

3 марта 2008 г.

А почему не камбала?

Прочитал сегодня в новостях: "Жители Сочи помимо будущего президента РФ выбирали символ предстоящей Олимпиады-2014. "По предварительным данным, реальным претендентом на победу является Дельфин на лыжах".

Пииииииииип. Приехали. Я очень надеюсь, что это шутка, хотя что-то подсказывает мне, что это — суровая реальность. Похоже, перевелись на Руси-матушке богатыри-дизайнеры. А может, их просто не пускают к князевой кормушке? Почему-то вспомнился "Школьный портал"... К чему бы?

Вот чего не пойму — это дельфин-мальчик или дельфин-девочка? В любом случае — жесть. Как и остальные претенденты...



PS. А камбала бы была прикольнее...

PPS. 03.03.2008 23:33
Все-таки пошутили сочинцы :) Прям от сердца отлегло. Правда, осадочек остался... ;)

21 февраля 2008 г.

Брат СамиЗнаетеКого

У Артемия Лебедева оказывается есть младший брат, который живет в Америке. Фотки у него действительно классные.

18 февраля 2008 г.

Цитата: Хаак

Бывший MVP (Most Valuable Professional – Самый Ценный Специалист) Microsoft Фил Хаак о повторных использованиях и обобщениях при разработке ПО
«Избегайте преждевременного обобщения», советует Хаак. «Не создавайте систему способную предсказать любое изменение. Пусть она будет достаточно гибкой для внесения изменений».

Чтобы определить, когда требуется обобщение, Хаак использует Правило Трех: «Когда вы в первый раз увидите, что что-либо может повторяться, не обобщайте это. В следующий раз сделайте все аналогичным способом, возможно даже при помощи копипастинга, но только не обобщайте. В третий раз хорошенько подумайте, как это можно обобщить».

Updated: Знакомство с Vim

По просьбе читателей поправил текст старой статьи "Знакомство с Vim. Настройки". Добавлено краткое описание режимов, а сам контент сделан более последовательным.

17 февраля 2008 г.

Книга "Motivate me right"

Станислав Давыдов выложил электронный вариант своей книги о мотивации "Motivate me right". Уже есть версия 1.1, а совсем скоро выйдет bugfixed-версия 1.2, как обещает сам Стас.

Книга вовсе не хулиганская (имхо), а очень даже хорошая и полезная. Сказать, что Стас открывает читателю какое-то тайное знание о мотивации — это неправда, но из-за реальных историй из биографии Стаса и других людей, которые присылали ему свои письма, книга производит очень мощное и позитивное впечатление. Ее очень интересно читать, потому что написана она легким и нескучным языком. Я прочел ее на работе за несколько часов. И не потому, что занятся было нечем, а потому, что не мог оторваться :) Must read.

6 февраля 2008 г.

Еще раз об MDA

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

Разработка серьезного программного продукта обычно ведется с использованием средств версионного контроля. При таком подходе довольно часто возникает необходимость выполнять какие-то работы (например, исправление ошибок) на дополнительных ветках, чтобы по окончании этих работ аккуратно слить результат на основную ветку.

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

2 февраля 2008 г.

Зацепило

Для этого интернет и нужен - обсирать других анонимно.
"Джей и молчаливый Боб наносят ответный удар"

Любой, имеющий в доме ружье, приравнивается
к Курту Кобейну.
Любой, умеющий читать между строк, обречен
иметь в доме ружье.

Сплин, "Пой мне еще"

Быдло - тупые, безвольные люди, покорные насилию.
Толковый словарь русского языка Ушакова


Злой я сегодня. Извините.

Смотрите видео Арбатовой. Читайте комментарии. Думайте. Делайте выводы...

Приятных сновидений.

1 февраля 2008 г.

Как сделать merge в cleartool

В ClearCase сделать слияние (merge) для файлов с разных веток довольно просто. Проблемы начинаются, если на сливаемых ветках добавлялись или удалялись файлы. Оказывается, слияние директорий в ClearCase — задача непростая.

Выполнить слияние двух веток можно следующей командой:

cleartool findmerge . -fversion <version/label> -co -nc -merge -gmerge

Эта команда выполнит слияние с ветки version или label на текущую ветку для всех файлов, содержащих изменения. Ключ -gmerge удобно использовать при работе в графической среде — при возникновении конфликтов cleartool запустит визуальный инструмент для разрешения конфликтов вручную. Но при работе, например, по SSH, указывать этот ключ смысла не имеет; в этом случае используется консольный инструмент разрешения конфликтов. Тем, кто пользуется консольным, можно только посочувствовать.

Пример. У меня в текущей папке есть файлы file1, file2 и file3. На ветке /main/mybranch1 выполнены изменения для файлов file1 и file3. Чтобы слить изменения с ветки /main/mybranch1 на текущую ветку, мне необходимо выполнить команду:

cleartool findmerge . -fversion /main/mybranch1/LATEST -co -nc -merge -gmerge

В результате выполнения файлы file1 и file3 будут вычекнуты (checkout) на текущую ветку и модифицированы в соответствии с изменениями на ветке /main/mybranch1. Мне останется лишь выполнить checkin для измененных файлов. Файл file2 останется нетронутым.

Но вот, предположим, что на ветке /main/mybranch1 добавлен еще один файл — file4. Выполнение findmerge никак не коснется этого файла, потому что на текущей ветке этого файла нет. Значит, нужно сначала сделать merge для директории.

Описание команды merge говорит о том, что слияние директорий происходит в три шага:
  1. убедиться, что на "той" ветке нет вычекнутых элементов;
  2. вычекнуть директорию в текущей ветке;
  3. выполнить команду cleartool merge для директории.

Только после этого можно будет безболезненно выполнить cleartool findmerge.

Итак, синхронизируем текщую директорию с веткой /main/mybranch1:

ct co -nc .
ct merge -to ./ ./@@/main/mybranch1/LATEST
  Added file file4 to ./.

Теперь можно зачекать измененную директорию (а можно сделать это потом). И наконец-то можно выполнить долгожданный findmerge:

cleartool findmerge . -fversion /main/mybranch1/LATEST -co -nc -merge -gmerge

Будет выполнено слияние для файлов file1, file3 и file4. Теперь нужно внести в репозиторий результаты слияния веток. Заносим всё сразу — зачем мелочиться? :)

ct ci -c "Merged from /main/mybranch1." `ct lsco -r -cview -short`

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

25 января 2008 г.

Цитата: Papadimoulis

Alex Papadimoulis о разработке корпоративного ПО (" Avoiding Development Disasters")
Единственный способ избежать (...) провалов, быть реалистом насчет успеха. И если взглянуть на вещи здраво, то корпоративное ПО обязано проработать минимум 15 лет. Все, что не может продержаться это время, должно считаться неудачным.

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

Грамотно спроектированная система, созданная на протяжении последних восьми–десяти лет не требует масштабной модернизации.

23 января 2008 г.

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

В очередной раз пересортировывал гигабайты статей и заметок, собранных на моем жестком диске, и наткнулся на текстовый файл с некоторыми правилами использования Open Source Software в своих разработках. Думаю, здесь этой заметке самое место.

Когда ваш продукт обязан быть Open Source

- если вы изменяли чужой GPL-код или исправляли в нем ошибки;
- если расширяли функциональность GPL-кода добавляя свой код;
- копировали фрагменты кода из GPL-продуктов в свой код;
- использовали заголовочные файлы из GPL-кода;
- статическая линковка вашего кода с GPL-кодом или LGPL;
- динамическая линковка с GPL-библиотеками или LGPL;


Когда ваш продукт не обязан быть Open Source

- при использовании GCC для компиляции вашего кода;
- при использовании открытых стандартов (HTTP, TCP/IP, SOAP, POSIX и т. д.);
- при взаимодействии вашей программы с OSS с помощью командной строки, пайпов или сокетов;
- при использовании архитектуры ПО, изолированной от OSS.

20 января 2008 г.

Что случилось с rapidshare

Сегодня сервер rapidshare.com исчез из сети. Все попытки коннекта к этому домену до сих пор заканчиваются ошибкой.

Мнения расходятся, но официальная версия — чрезмерная нагрузка на сервер.

Тем не менее сервис rapidshare доступен по IP 80.239.151.250
Все файлы существуют и аккаунты функционируют.

Источник blog.biggestinfo.com

P.S. Пока еще не починили, я прописал себе IP в hosts — отлично работает.