понедельник, 20 сентября 2010 г.

Скролл для блока

В конце каждого спринта презентуется проект со всеми достигнутыми целями и неудачами. Это всегда встреча заказчика и команды, на которой последняя может продемонстрировать результаты своей работы, доложить о проблемах, с которыми она столкнулась. Что это даёт? Во-первых, это психологический deadline, по-другому - стимул (для команды, разумеется). Во-вторых, происходит конструктивный диалог между представителями бизнеса и исполнителями. В результате этого диалога проясняются новые моменты, достигается (иногда) взаимопонимание. Обратная связь здесь неоценима: заказчик контролирует ход работы и, в конечном счёте, получает то, что ему нужно. В-третьих, для разработчиков важно отметить (повторить) для себя ошибки и ответить на вопросы: "Всё ли продвигалось согласно плану?", "Правильно ли оценена сложность задач?". А ответив на них, скоординировать свои дальнейшие действия.

воскресенье, 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).

воскресенье, 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 бита).

воскресенье, 30 мая 2010 г.

Требуется: отключать декорации окон при развёртывании окна приложения на весь экран.
Что имеется: gnome (декоратор - metacity) + compiz
Решение: запустить ccsm -> войти в пункт "Декорации окон" (Window Decorations) -> в поле ввода "Декорирование окон" (Decoration Windows) вбить вместо any вот это:
!state=maxvert

пятница, 21 мая 2010 г.

Математика и функциональное программирование

Теория категорий. Именно об этом часто упоминают те, кто в теме о 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
data Sex = Male | Female
В общем получается такая картина аналогий (теория категорий -> 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:
class C a where
   f1 :: a Int -> Int
   f2 :: a -> Bool
   f3 :: a -> C a
Который (этот класс) является интерфейсом, представляющим ограниченное число функций, действующих в рамках заданных типов. Получается, что объект подчиняется морфизмам из числа тех, что определены заданным классом. Здесь a является именем типа, вакантным местом для пользовательского типа, определяемым уже на этапе реализации класса:


instance C Int where
   f1 a b = a `mod` b
   f2 i = i > 2
Так, определены уникальные функции f1 и f2 для типа Int. Для других типов функции могут быть реализованы иначе. В целом, классы в haskell - для определения поведения функций в зависимости от типов входных параметров. Это - если совсем просто.

воскресенье, 25 апреля 2010 г.

Запомнить по поводу VirtualBox

Для начала нужно включить пользователя в группу vboxusers для нормального прокидывания usb-портов (включая флешки):
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