четверг, 17 ноября 2011 г.

Заметка о PowerMock (+Mockito)

Статья SuppressUnwantedBehavior покрывает большинство основных вопросов (также советую статью про замену методов класса). Несколько моментов, которые я хотел бы подчеркнуть:

PrepareForTest
В эту аннотацию нужно вписать все классы, в которых используется PowerMock.
@PrepareForTest(MyClass.class)

SuppressStaticInitializationFor
Эта аннотация поможет, когда нужно создать класс без статической инициализации.
@SuppressStaticInitializationFor("path.to.class.ClassWithStaticParameter")
class ClassWithStaticParameter()
{
   private static final Log log = LogFactory.getLog(ClassWithStaticParameter.class);
}

Замена статичных методов
replace(method(OldClass.class, "callOldMethod")).with(method(NewClass.class, "callNewMethod"));

Указание сигнатуры метода
Если есть несколько методов с одинаковым названием, то, например для подавления метода, нужно указывать сигнатуру.
suppress(method(MyClass.class, "callMethod", String.class /*сигнатура*/));

Mockito.CALLS_REAL_METHODS
Позволяет использовать переопределенные методы в абстрактных классах. В следующем примере при отсутствии Mockito.CALLS_REAL_METHODS вместо getAttribute() из FakeHttpSession был бы вызван метод HttpSession.getAttribute().
HttpSession fakeHttpSession = mock(FakeHttpSession.class, Mockito.CALLS_REAL_METHODS);
fakeHttpSession.getAttribute("attr"); 

abstract class FakeHttpSession implements HttpSession
{
    private HashMap attrs;

    public Object getAttribute(String s) {
        if (attrs == null) attrs = new HashMap();
        return attrs.get(s);
    }

    public void setAttribute(String s, Object o) {
        if (attrs == null) attrs = new HashMap();
        attrs.put(s,(String)o);
    }
}

суббота, 24 сентября 2011 г.

Еще одна статья о Latex

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

Начнем с самого начала, хотя порядок может быть и другим.
Доктор Who, Meglos


Установка

Скачиваем LaTeX. При установки разрешаем скачивать дополнительные файлы из интернета, т.к. в последующем при подключении разных модулей для форматирования текста, потребуется докачка файлов.

Полезные ссылки

Ссылка не небольшой справочник.
При наборе формул может помочь редактор формул.

Создание документа

Набирать диплом в стандартной оболочке Miktex не очень удобно, т.к. у него есть маленькие проблемы с русским языком. Вместо этого я набирал диплом в Notepad++, в котором также есть поддержка синтаксиса LaTeX.

Теперь определимся с иерархией файлов для документа. Я использовал следующую структуру:
  • main.tex - главный файл, в котором содержится подключение различных модулей и файлов диплома;
  • остальные *.tex содержат текст документа и команды (например chapterX.tex - содержит главу X, introduction.tex - введение, bible.tex - список литературы);
  • в папке img содержаться все рисунки.
Несколько простых команд для начала:
\documentclass[a4paper,12pt]{article} - определяем тип бумаги A4, размер шрифта 12pt, стандартный класс документа article, для которого предопределен форматирование документа (следующие команды переопределяются формат некоторых частей документа).
\usepackage[left=3cm,right=1cm,top=2cm,bottom=2cm]{geometry} - задаем отступы текста от границ листа.
\usepackage[russian]{babel} - подключаем возможность использования русского языка.
\begin{document} ... \end{document} - между этими командами можно писать текст и пользоваться командами форматирования.
В своём дипломе я решил вынести текст и команды форматирования в отдельный файлы:
main.tex
......
\begin{document} 
  ......
  \tableofcontents 
  \clearpage
  \input{referat.tex}
  \clearpage 
  ......
\end{document}

\clearpage - разрыв страницы.
\tableofcontents - содержание документа, в качестве элементов содержания используется нумерованные заголовки, которые задаются командами \section{}, \subsection{}, \subsubsection{}.
\section{Заголовок} - форматирование текста как заголовок с нумерацией (в LaTeX у многих команд есть внутренний счетчик, который увеличивается при повторении команды), если нумерация не нужна, то можно воспользоваться \section*{Заголовок}.
\input{referat.tex} - выполнение команд из файла.
Ненумерованный список реализуется следующим образом
\begin{itemize}
\item 33\% женщин и более 17\% мужчин, которые доживут до 90 лет, 
перенесут перелом бедра\footnote[1]{Melton III LJ , 1993};
\item лечение 75\% переломов не удовлетворительно;
\item кость после перелома невозможно восстановить до первоначальной прочности;
\end{itemize}
% - все что идет после этого символа и до перехода на новый строку считается комментарием.
\ - экранирует спец символы и команды, например \% позволит вывести "%".
\footnote[1]{Текст} - сноска, в качестве номера используется текст из [], иначе нумерация идет сквозная через весь документ
\begin{enumerate} ... \end{enumerate} - использование enumerate вместо itemize позволяет вывести нумерованный список. Если необходимо использовать нумерацию типа "1)" вместо "1.", то можно задать свою нумерацию следующим образом
\begin{enumerate}
\item[1)] слизистый;
\item[2)] красный или лимфоидный;
\item[3)] желтый или жировой.
\end{enumerate}
Если в тексте присутствует рисунок, то стоит подключить модули
\usepackage{graphicx}
\usepackage{graphics}
\usepackage{float}
Рисунок выводится при помощи команд
\begin{figure}[H]
\centering
\includegraphics[scale=1.0]{img/bm2.png}
\caption{Основные отделы бедренной кости}
\label{ris1_1}
\end{figure}
Все команды предельно понятны за исключением опции [H]. Не моими словами опцию можно объяснить так (оригинал):
  • [h] "хотелось бы картинку здесь"
  • [h!] "очень хочу картинку здесь"
  • [H] "ХОЧУ картинку здесь и баста"
Для того чтобы в подписе к рисунку стояла "." нужно в преамбуле дописать
\usepackage{ccaption}
\usepackage{topcapt}
\captiondelim{. }
\label{Текст} - позволяет сделать метку, к которой замет можно обратиться в тексте.
\ref{Текст} - возвращает порядковый номер таблицы или рисунка, для которого была сделана метка \label{} (например можно использовать так рис.~\ref{surfs}).
Вывод таблицы:
\begin{table}[h]
\centering
\begin{tabular}{ |p{2cm}|p{1cm}|p{1cm}|p{1cm}|p{1cm}|p{1cm}|p{1cm}|p{3cm}| }
\hline
Имплантат & $\sigma_x$, МПа & $\sigma_y$, МПа & $\sigma_z$, МПа & $\sigma_xy$, МПа & 
$\sigma_yz$, МПа & $\sigma_zx$, МПа & Снижение напряжения, \% \\ \hline
--- & 116 & 194 & 203 & 39 & 66 & 25 & --- \\ \hline
Спица & 88 & 138 & 184 & 16 & 75 & 21 & 10.3 \\ \hline
Две спицы & 97 & 171 & 185 & 31 & 66 & 18 & 9.7 \\ \hline
Штопор & 116 & 191 & 196 & 37 & 71 & 25 & 3.6 \\ \hline
\end{tabular}
\label{t1}
\end{table}
При выполнении этого кода увидим такую таблицу
Вывод формулы можно организовать так
\begin{equation}
 \frac{|\max(\sigma_i)-\max(\sigma_{impl_{i}})|}
 {|\max(\sigma_{impl_{i}})|}\times 100\%~~~i 
 \in (x,y,z,xy,yz,zx)
\end{equation}
где $\sigma_i$ --- компонента тензора напряжения в кости без имплантатов, 
$\sigma_{impl_{i}}$ --- компонента тензора напряжения в кости с имплантатами.
Выглядит формула следующим образом
Основные команды:
$\sigma$ - позволяет использовать математическое форматирование в тексте без заключения выражения в конструкцию \begin{equation} ... \end{equation}
\sigma_i - нижний индекс "_i"
"~" - не разрывный пробел (перенос на следующую строчку происходит вместе с правым и левым словом, относительно пробела). В данном же случае используется как несколько обязательных пробелов.
\usepackage{amsmath} - этот модуль нужно подключить для работы с математическими формулами
\times - знак умножения
\frac - дробь
При наборе формул может помочь редактор формул.
В конце диплома обязательно должен присутствовать список используемой литературы. Его оформить можно с помощью BibTeX, однако для этого нужно дополнительно установить некоторые программы. В своем дипломе я решил использовать более старый подход.
\addcontentsline{toc}{section}{Список используемой литературы} 
\begin{thebibliography}{}
\bibitem[1]{b_1}
Минасов Б.Ш., Ханин М.Ю., Якупов Р.Р., Минасов Т.Б. Результаты стендовых испытаний 
системы кость-имплантат-кость в условиях стандартного остеосинтеза при переломах 
проксимального отдела бедра // Казанский медицинский журнал, 2010. \No1. С.~40--44.
\cite{b_4} - ссылка на литературу в тексте диплома \addto\captionsrussian{\def\refname{Список используемой литературы}} - переименование названия списка литературы на "Список используемой литературы"
Код программы нужно оформлять в конструкции \begin{verbatim} ... \end{verbatim}
\begin{verbatim}
def main():
    ...
    f.write('CSYS,0\n')
    f.write('WPCSYS,-1,0')
    f.write('\n')
    f.close()
    ...
main()
\end{verbatim}

\tolerance=10000 - коэффициент, который определяет когда слова нужно переносить на новую строку. Мне подошло значение 10000.
\linespread{1.5} - полуторный интервал
\usepackage{indentfirst} - первый абзац будет начинаться с красной строки
\setlength{\parindent}{1cm} - установка размера отступа для красной строки Изменение обозначений в параграфах, пунктах и подпунктах:
\makeatletter
\renewcommand{\@biblabel}[1]{#1.}

\renewcommand \thesection {\@arabic\c@section.}
\renewcommand\thesubsection {\thesection\@arabic\c@subsection.}
\renewcommand\thesubsubsection {\thesubsection\@arabic\c@subsubsection.}
Возможность использования своего собственного счетчика
\makeatother
\newcounter{N}
И в конце еще раз ссылка на исходный код. Удачи в написании дипломов, курсовых и др.

четверг, 18 августа 2011 г.

Упрощение 3D модели

Если необходимо провести упрощение 3D модели, в частности уменьшить количество узлов и поверхностей тела, то возможно пригодиться программа MeshLab.
В данной программе присутствует множество различных фильтров, однако в них можно и запутаться (как это произошло со мной). Для моей цели необходимо было упростить модель примерно в 15000 узлов до 3000. Затем набор точек преобразовывался с помощью небольшой программы на Python из формата *.wrl в команды понятные ANSYS. К сожалению не все фильтры из MeshLab упрощают модель, и еще меньше фильтров позволяют не поломать топологию (из-за чего ANSYS не может построить объемную модель из поверхностей).

Quadric Edge Collapse Decimation - один из фильтров, который позволяет упростить модель без нарушения топологии. Он находиться в Filters \ Remeshing, simplification and reconstruction \ Quadric Edge Collapse Decimation.

Настройки фильтра показаны на рисунке ниже

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

среда, 10 августа 2011 г.

Шкала оценки

Существует множество шкал оценки чего-либо. Мне кажется, что самая лучшая - это шкала в 7 элементов. Попробую объяснить свою точку зрения.

Самая большая из наиболее известных шкал - 100-бальная шкала. Согласитесь, если вас попросят сказать как вы оцениваете свое отношение, например к шоколаду, трудно будет сказать с точность до одного балла свое отношение. Скорее всего, оценка будет производиться по 10-бальной шкале, но с учетом, что 1 балл = 10 баллам.
Поскольку мне сложно представить с чем ассоциировать каждый элемент для шкалы-10, то и другим людям это может быть проблематично, поэтому шкалу-10 можно отбросить.
С другой стороны самая маленькая шкала "да|нет" часто не позволяет оценить свое отношение, особенно когда вы затрудняетесь ответить. В этом случае будет использоваться шкала "да|нет|не знаю".
Еще одним важным моментом для шкал является наличие нейтрального элемента, таким образом шкала должна быть нечетной.
Итак сократили количество шкал до 3, 5, 7, 9 элементов.

Я редко встречал шкалу из 9 элементов, поэтому я ее тоже отбрасываю.
Для оценки качества шкала-3 будет выглядеть "плохо|нейтрально|хорошо" - это наверно одна из наиболее употребляемых шкал, т.к. довольно просто отнести один объект к элементу из шкалы. Но если, объектов больше, скажем больше 5 (а это бывает часто), то назревает необходимость использовать более точную шкалу. Поскольку шкала-3 никуда не годиться при существовании нескольких объектов исследования, то она отбрасывается.
Остается шкала-5 и шкала-7.

Составим именованный ряд элементов.
Шкала-5 Шкала-7
  1. Ужасно
  2. Плохо
  3. Нормально
  4. Хорошо
  5. Отлично
  1. Отвратительно/Ужасно
  2. Плохо/Сойдет и так
  3. Хуже среднего
  4. Нормально
  5. Лучше среднего/Хорошо
  6. Почти идеал/Отлично
  7. Идеально
Наверно шкала-5 была бы самая лучшая, и наиболее значимым фактом в этом является школьная система оценки. Но часто люди говорят, что вот это лучше среднего, а вот это почти идеал. А раз есть почти идеал то нужна и категория "Идеал". Таким образом мы получаем шкалу из 3-х элементов + нейтральный. По симметрии получаем еще 3 элемента снизу от нейтрального, итого 7. Поскольку я часто пользуюсь пунктами 5,6, а также иногда иногда 2,3,4, то мне ближе шкала-7.

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

Широкий Blogger

Когда пишешь новый пост, по появляется довольно узкое окно ввода. Почему оно не расширяется мне не понятно, а так как я недавно начал писать большой пост - узкое окно просто не приемлемо для меня. В связи с этим я решил написать плагин для FF, что бы окно было шире. Прощу прощения за ошибки в коде/архитектуре плагина, т.к. это мой первый плагин, на данный момент в большей степени пробный экземпляр нежели готовый продукт. Результат же выглядит следующим образом
Альбом: 29 июля 2011 г.
Изменения размера формы происходит благодаря коду (overlay.js, подробности можно посмотреть в предыдущем посте о том как создавать плагины для FF):

var gbepfw = {
  onLoad: function() {
    var appcontent = document.getElementById("appcontent");
    if (appcontent)
      appcontent.addEventListener("DOMContentLoaded", gbepfw.onPageLoad, true); 
  },
  getFirstDivByClass: function(theClass,doc) {
    var allHTMLTags=doc.getElementsByTagName("div");
    for (i=0; i < allHTMLTags.length; i++)
      if (allHTMLTags[i].className==theClass)
        return allHTMLTags[i];
  },
  onPageLoad: function(aEvent) {
    //TODO - check url on http://www.blogger.com/post-edit.g
    var doc = aEvent.originalTarget; // doc - документ, на котором произошло событие "onload"
    doc.getElementById("postingHtmlBox").style.width="100%";
    gbepfw.getFirstDivByClass("main",doc).style.width = gbepfw.getClientWidth(0.9,doc)+"px";
  },  
  getClientWidth: function(koef,doc) { 
    var width = 1000;
    if (window.innerWidth) 
      width = window.innerWidth;
    else if (doc.documentElement && doc.documentElement.clientWidth) 
      width = doc.documentElement.clientWidth; 
    else if (doc.body && doc.body.clientWidth) 
      width = doc.body.clientWidth; 
    width *= koef;
    return width;
  }
};
window.addEventListener("load", function () { gbepfw.onLoad(); }, false);
Описание функций:
  • getClientWidth() - вычисляет размер окна;
  • getFirstDivByClass() - ищет первый "div" (он единственный) с css-классом "main" ;
  • onLoad() - точка входа;
  • onPageLoad() - применяем новые стилевые свойства для "div" с css-классом "main" и элемента с id "postingHtmlBox".

пятница, 29 июля 2011 г.

Минимализация плагина для FF

Прежде чем начать статью, хочу сослаться на "Как создать свой плагин для Firefox" - очень лаконичный пост для начинающих писателей плагинов для FF.
Однако, хоть та статья и написана очень просто, я умудрился наступить на несколько граблей. Вот о них я и напишу, чтобы самому их помнить, да и другим помочь, если получиться.
Итак, для того чтобы разобраться в чем-то новом лучше начинать с простого, но в большинстве случаев, на мой взгляд, даже мануалы типа Getting started имеют множество лишних элементов. Так и с Add-on Developer Hub из указанной выше статьи. Даже в самом простом плагине мы получаем аж 9 файлов (>100 cтрок кода) - согласитесь это никак не подходит для программы типа Hello world.
Уменьшим количество кода как можно больше, но так, что бы мы могли вывести заветную мантру "Hello World!!!". Для этого оставим такую структуру файлов:
./chrome
    /content
      ff-overlay.xul
      overlay.js
chrome.manifest
install.rdf
Уберем лишний код и оставим только нужное.
/install.rdf


  
    email@mail.ru
    2
    Google Blogger expand posting form width
    0.1
    stswoon
    
    Google Blogger expand width of form of creating new post
    
      
        {ec8030f7-c20a-464f-9b0e-13a3a9e97384} 
        4.0
        8.0
      
    
  


Грабля 1. Обратите внимание на <em:minVersion> и <em:maxVersion>. В процессе создания шаблона плагина через Add-on Developer Hub можно ненароком указать версии наоборот (FF8-FF4 вместо FF4-FF8), из-за чего плагин не будет загружаться в FF с локального компьютера и может не сказать почему он не загружается.
/chrome.manifest
content   gbepfw                 chrome/content/

overlay   chrome://browser/content/browser.xul   chrome://gbepfw/content/ff-overlay.xul

Здесь указываем ссылку на файл ff-overlay.xul. От папок избавиться нельзя.
/chrome/content/ff-overlay.xul


  <script src="overlay.js"/>


Здесь указываем ссылку на файл overlay.js
/chrome/content/overlay.js
var gbepfw = {
  onLoad: function() {
    alert("Hello World!!!");
  }
};

window.addEventListener("load", function () { gbepfw.onLoad(); }, false);

Этот файл показывает сообщение при загрузке FF.
Грабля 2. При генерировании шаблона создаются два файла ff-overlay.js и overlay.js, обратите внимание, что для Hello World нужно оставить именно overlay.js.

Итак мы получили всего 4 файла и меньше чем 25 строк кода. Я думаю, здесь сложнее запутаться. Теперь засовываем эту иерархию файлов в zip-архив и открываем в FF для проверки. Если собираетесь выкладывать плагин в сеть, то предварительно поменяйте расширение архива на xpi.

Грабля 3. Формируйте архив без сжатия.

PS: пока писал пост, наткнулся на очень интересную тему подсветки кода в Blogger. Мне очень помогла эта статья.

суббота, 18 июня 2011 г.

Концепт набора времени для смартфонов

Многие, наверно, знают как выглядит контрол для набора времени в htc sense

На мой субъективный взляд htc sense позволяет быстрее выбирать время, чем стандартный контрол для android

Но мне кажется можно сделать контрол, который позволит еще быстрее выбирать время (по крайней мере 'эффективнее, чем стандартный контрол). Поэтому представляю свой концепт набора времени.
Концепт написан на html+js+css. исходный код можно взять здесь.



понедельник, 16 мая 2011 г.

Метод создания форм для конфеты "Петушок"

Как-то захотелось поесть конфету "Петушок", давно уже не видел их в продаже, везде сплошной чупа-чупс. Для тех кто не в теме Петушок состоит из вареного сахара и воды (рецепт можно найти например здесь), а выглядит он так:


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

Т.к. форм у меня не было пришлось выкручиваться и тогда я решил сделать slim-петушок. Для этого нам понадобиться:
  1. Ножницы
  2. Картон
  3. Бумага
Для начала скачаем силуэт петуха из инета (причем можно выбрать любую другую фигуру), у меня он выглядит так:


Теперь вырежем из картона фигуру петуха, получим:


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


Хотя ширина картонки довольно малая, кофета получится за счет вязкости жидкости вареного сахара, шире чем глубина вогнутости в фольге. Не забудьте смазать форму маслом, чтобы можно было без проблем вытащить конфету из фольги.

Теперь дело за вами - готовьте жидкость из вареного сахара и заливайте.

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

Первый экземпляр у меня получился лучше, чем приведенный на рисунке, но сделать фото я не успел, т.к. он был съеден. А второй экземпляр выглядит так:

воскресенье, 10 апреля 2011 г.

Маленький linux

В этой статье показано как установить небольшой линукс, скажем на прототип робота, на примере операционной системы damn small linux. Его плюс в том, что он весит очень мало и его не надо собирать.

Начнем установку.


Теперь заставим его загружаться всегда в текстовом режиме, что бы не тратить ресурсы на графику.


И наконец установим СИ, чтобы можно было программировать устройство, на котором мы поставили dsl. Для этого предварительно нужно скачать пакеты для установки с репозитория dsl. В частности в разделе system нам понадобятся пакеты:
  • gcc1-with-libs.dsl
  • libc6-dev.dsl
Установка происходит в виртуальной машине, поэтому перед установкой в видео подключается диск на котором предварительо закачены необходимые файлы.
Следующими шагами могут являться написание программы для работы с com-портом и настройка автоматического запуска этой программы после запуска ОС.

суббота, 12 марта 2011 г.

Web-инструменты

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

Начнем с того, что разработка преимущественно ведется для IE7, IE8, FF. Причем в качестве языков программирования я использую java + javascript.

Итак для программирования под IE7, IE8 собственно нужны эти браузеры, для этого можно использовать IE collection.
Великолепный снифер - HttpWatch. Однако, я считаю, нет смысла в использовании бесплатной версии, потому что в ней недостаточно функциональности, в отличии от Professional Edition.
В качестве инструмента просмотра html и javascript-консоли я использую BebugBar
Для debug'a javascript установлено СompanionJS

Для FF есть отличное комплексное решение Firebug, которое совмещает все возможности из перечисленных выше инструментов для ie и имеет большую функциональность. Правда по части анализа трафика HttpWatch Professional Edition немного лучше.

Следующий инструмент напрямую нельзя приписать к веб-инструментам, но иногда я им пользуюсь. WinMerge - программа для сравнения различий между файлами.

Пользуясь правами автора блога хочу упомянуть еще об одной программке для декомпиляции jar файлов - JAD.

суббота, 19 февраля 2011 г.

График успеха

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

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


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

Но потом в период А-B задачи становятся сложнее их иногда вообще не получается решить быстро и легко. Человеку перестает нравиться проект, кажется, что он не сможет его решить никогда, и он для него не подходит. К моменту B все становиться совсем плохо. В этот переломный момент многие покидают проект. Но если человек выдержит этот период, если пересилит трудности, не переставая работать, то сразу после момента B задачи раньше никак не решавшиеся вдруг решаются. Сразу появляется уверенность. И впоследствии успех только растет.

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

Еще раз повторюсь, что этот график очень субъективен. Для меня период О-А обычно длиться 0.5-1.0 месяц, период А-В длиться 1.5-2.0 месяца.

А как у вас?