В конце каждого спринта презентуется проект со всеми достигнутыми целями и неудачами. Это всегда встреча заказчика и команды, на которой последняя может продемонстрировать результаты своей работы, доложить о проблемах, с которыми она столкнулась. Что это даёт? Во-первых, это психологический deadline, по-другому - стимул (для команды, разумеется). Во-вторых, происходит конструктивный диалог между представителями бизнеса и исполнителями. В результате этого диалога проясняются новые моменты, достигается (иногда) взаимопонимание. Обратная связь здесь неоценима: заказчик контролирует ход работы и, в конечном счёте, получает то, что ему нужно. В-третьих, для разработчиков важно отметить (повторить) для себя ошибки и ответить на вопросы: "Всё ли продвигалось согласно плану?", "Правильно ли оценена сложность задач?". А ответив на них, скоординировать свои дальнейшие действия.
понедельник, 20 сентября 2010 г.
воскресенье, 12 сентября 2010 г.
Модель предметной области TODO-менеджера
Как следствие вот этого.
Собственно задачи (просто идентификатор и содержимое): T(odos) = ID x CONTENT, где ID = Int, CONTENT = String.
То есть, forall t in T: t = (id, content), id in ID, content in CONTENT.
Отложенные задачи (это так называемый стек задач - общая куча перспективных дел): D(eferred) = T x {0,1}.
forall d in D: d = (t, 0|1).
Завершённые задачи (задача завершена, если 1 + указывается время, когда она таковой стала): C(omplited) = T x {0,1} x TIME, TIME - время.
forall c in C: c = (t, 0|1, time).
Запомненные (задачи описываются крайней датой, наступление которой трактуется как deadline): R(emember) = T x {0,1} x TIME
forall r in R: r = (t, 0|1, time).
Собственно задачи (просто идентификатор и содержимое): T(odos) = ID x CONTENT, где ID = Int, CONTENT = String.
То есть, forall t in T: t = (id, content), id in ID, content in CONTENT.
Отложенные задачи (это так называемый стек задач - общая куча перспективных дел): D(eferred) = T x {0,1}.
forall d in D: d = (t, 0|1).
Завершённые задачи (задача завершена, если 1 + указывается время, когда она таковой стала): C(omplited) = T x {0,1} x TIME, TIME - время.
forall c in C: c = (t, 0|1, time).
Запомненные (задачи описываются крайней датой, наступление которой трактуется как deadline): R(emember) = T x {0,1} x TIME
forall r in R: r = (t, 0|1, time).
воскресенье, 8 августа 2010 г.
Вопросы по C++, ответы на которые нужно знать
Перечень вопросов здесь.
1. How do you check whether a linked list is circular?
Про связные списки бегло читать на википедии.
Реализацию односвязного списка средствами C++ можно наблюдать, например, вот тут. Новые элементы добавляются в начало списка.
Сначала отступление и лирика. Какой список содержит циклы? Тот, в котором присутствуют повторения элементов. Поэтому, список не содержит циклы, если в нём присутствуют уникальные элементы (если что - вопрос не об этом :)).
Решение нуль: сформировать std::set из элементов связного списка; если размер сформированного std::set меньше чем размер связного списка, то в списке существуют циклы, число которых равно разности размеров списка и множества std::set.
Решение про цикличный связный список: список является цикличным если его первый элемент соответствует элементу, следующему за последним (определение); поэтому, нужно перейти к последнему элементу и сравнить головной_элемент списка списка с последний_элемент->следующий_элемент.
2. How do you decide which integer type to use?
Про типы можно почитать здесь.
Ответ: выбор целочисленного типа определяется прикладной задачей, решаемой в рамках данной предметной области; первое - это ширина коридора принимаемых значений переменной целочисленного типа (char, short, int, long; с использованием модификаторов signed, unsigned), второе - количество памяти, отводимое под переменную соответствующего типа (8, 16, 32 бита).
1. How do you check whether a linked list is circular?
Про связные списки бегло читать на википедии.
Реализацию односвязного списка средствами C++ можно наблюдать, например, вот тут. Новые элементы добавляются в начало списка.
Сначала отступление и лирика. Какой список содержит циклы? Тот, в котором присутствуют повторения элементов. Поэтому, список не содержит циклы, если в нём присутствуют уникальные элементы (если что - вопрос не об этом :)).
Решение нуль: сформировать std::set из элементов связного списка; если размер сформированного std::set меньше чем размер связного списка, то в списке существуют циклы, число которых равно разности размеров списка и множества std::set.
Решение про цикличный связный список: список является цикличным если его первый элемент соответствует элементу, следующему за последним (определение); поэтому, нужно перейти к последнему элементу и сравнить головной_элемент списка списка с последний_элемент->следующий_элемент.
2. How do you decide which integer type to use?
Про типы можно почитать здесь.
Ответ: выбор целочисленного типа определяется прикладной задачей, решаемой в рамках данной предметной области; первое - это ширина коридора принимаемых значений переменной целочисленного типа (char, short, int, long; с использованием модификаторов signed, unsigned), второе - количество памяти, отводимое под переменную соответствующего типа (8, 16, 32 бита).
воскресенье, 30 мая 2010 г.
Требуется: отключать декорации окон при развёртывании окна приложения на весь экран.
Что имеется: gnome (декоратор - metacity) + compiz
Решение: запустить ccsm -> войти в пункт "Декорации окон" (Window Decorations) -> в поле ввода "Декорирование окон" (Decoration Windows) вбить вместо any вот это:
Что имеется: gnome (декоратор - metacity) + compiz
Решение: запустить ccsm -> войти в пункт "Декорации окон" (Window Decorations) -> в поле ввода "Декорирование окон" (Decoration Windows) вбить вместо any вот это:
!state=maxvert
пятница, 21 мая 2010 г.
Математика и функциональное программирование
Теория категорий. Именно об этом часто упоминают те, кто в теме о haskell. Мол многое оттуда.
Поэтому решил разобраться, вникнуть. Возможно, вспомнить школу: ибо в вузе не математикой занимался.
Серьёзную литературу не брал - ограничился википедией.
Первый вопрос, который возник, - что такое категория.
Выяснилось: категория есть класс объектов, для которого задано множество морфизмов.
Ну, что такое множество - вроде понимаю. Неясными остаются понятия класс, объект, морфизм.
Начну с объекта. Здесь и далее буду проводить аналогии с программированием.
Объект - это область значений (то есть, объект предметной области). Пример: объект натуральных чисел, объект булевых состояний. Область значений - это ни что иное как тип (из мира программирования). Область значений часто ограничена некоторыми рамками. Для бинарной области: 1 и 0 (true или false). Тип - Bool, значения (или экземпляры) - {true, false}.
Далее - морфизм. Морфизм есть функция. То есть, это отображение f одного пространства (области значений) на другое:
Класс - множество объектов, обладающих определённым свойством (например, они эквивалентны между собой). По сути класс математики очень похож на тип в программировании. То есть, в haskell, например, можно ввести собственный параметризованный тип:
Объект -> тип: 1 | True | Male
Морфизм -> функция: add :: Int -> Int -> Int, add x y = x + y
Класс -> параметризованный тип: data Color a = Red | Green | Blue | RGB a a a
Осталась категория. Если собрать всё вышеизложенное воедино и упростить, то получается, что категория представляет собой тип (или параметризованный тип), для которого задано множество функций. И это понятие соответствует классу (class) языка haskell:
Поэтому решил разобраться, вникнуть. Возможно, вспомнить школу: ибо в вузе не математикой занимался.
Серьёзную литературу не брал - ограничился википедией.
Первый вопрос, который возник, - что такое категория.
Выяснилось: категория есть класс объектов, для которого задано множество морфизмов.
Ну, что такое множество - вроде понимаю. Неясными остаются понятия класс, объект, морфизм.
Начну с объекта. Здесь и далее буду проводить аналогии с программированием.
Объект - это область значений (то есть, объект предметной области). Пример: объект натуральных чисел, объект булевых состояний. Область значений - это ни что иное как тип (из мира программирования). Область значений часто ограничена некоторыми рамками. Для бинарной области: 1 и 0 (true или false). Тип - Bool, значения (или экземпляры) - {true, false}.
Далее - морфизм. Морфизм есть функция. То есть, это отображение f одного пространства (области значений) на другое:
f: A -> B.Если a in A, b in B, то справедливо f(a) = b.
Класс - множество объектов, обладающих определённым свойством (например, они эквивалентны между собой). По сути класс математики очень похож на тип в программировании. То есть, в haskell, например, можно ввести собственный параметризованный тип:
data Animal sex = Cat sex | Dog sexВ общем получается такая картина аналогий (теория категорий -> haskell):
data Sex = Male | Female
Объект -> тип: 1 | True | Male
Морфизм -> функция: add :: Int -> Int -> Int, add x y = x + y
Класс -> параметризованный тип: data Color a = Red | Green | Blue | RGB a a a
Осталась категория. Если собрать всё вышеизложенное воедино и упростить, то получается, что категория представляет собой тип (или параметризованный тип), для которого задано множество функций. И это понятие соответствует классу (class) языка haskell:
class C a whereКоторый (этот класс) является интерфейсом, представляющим ограниченное число функций, действующих в рамках заданных типов. Получается, что объект подчиняется морфизмам из числа тех, что определены заданным классом. Здесь a является именем типа, вакантным местом для пользовательского типа, определяемым уже на этапе реализации класса:
f1 :: a Int -> Int
f2 :: a -> Bool
f3 :: a -> C a
instance C Int whereТак, определены уникальные функции f1 и f2 для типа Int. Для других типов функции могут быть реализованы иначе. В целом, классы в haskell - для определения поведения функций в зависимости от типов входных параметров. Это - если совсем просто.
f1 a b = a `mod` b
f2 i = i > 2
воскресенье, 25 апреля 2010 г.
Запомнить по поводу VirtualBox
Для начала нужно включить пользователя в группу vboxusers для нормального прокидывания usb-портов (включая флешки):
Чтобы не было фризов (в гостевой XP) нужно стартовать модуль vboxdrv со спасительным флагом:
Или по-человечьи отредактировать старт-скрипт:
usermod -a -G vboxusers [username]
Чтобы не было фризов (в гостевой XP) нужно стартовать модуль vboxdrv со спасительным флагом:
modprobe vboxdrv force_async_tsc=1
Или по-человечьи отредактировать старт-скрипт:
if ! modprobe $MODNAME force_async_tsc=1 > /dev/null 2>&1; then
Подписаться на:
Комментарии (Atom)