Thursday, 17 January 2019

Implementing mocking objects with Moq when constructor has parameters

Very often we faced with the situation, we have to mock object, that have no interface.

The best thing to do would be right click on your class and choose Extract interface. But in case it isn't possible let's start work with existing class. So, usually it doesn't cause any problems, we can do it easy:
    public class TestConstructor { ...

    public void SomeTest() {
        var t = new Mock<TestConstructor>();

The only problem with Mocking Concrete types is that Moq would need a public default constructor(with no parameters).

Let's imagine that we have class with public constructor with parameters:
    public class TestConstructor {
        public TestConstructor(string val)
            Value = val;

        public string Value { get; }

    public void SomeTest() {
        var t = new Mock<TestConstructor>();
        // the next raw throw an exception
        var tt = t.Object.Value; // exception!

In case we try this code, will get an Exception, because we can't create an instance of object in this way of class, that doesn't have public constructor without parameters.
Well  we need to create the Moq with constructor arg specification:
    public class TestConstructor {
        public TestConstructor(string val)
            Value = val;

        public string Value { get; }

    public void SomeTest() {
        var t = new Mock<TestConstructor>(MockBehavior.Strict, new object[] { "data" });
        // now, the next raw is OK
        var tt = t.Object.Value; // tt = "data"

Of cause we can simplify mocking using short syntax:
    var t = new Mock<TestConstructor>("data");

That's all!

Monday, 23 October 2017

How to flush DNS cache on Linux and FreeBSD and Windows?

If I'm on a Linux/Unix system that does not run a DNS server 'named/bind/other' the system does not cache any DNS query.

In case when I run primary DNS and want to update zone information, I have change the serial in zone and restart service:

# /etc/rc.d/named restart (for named)
# rndc (for bind9)

To update zone information, check if I get a right DNS answer:

# dig @dns_server

If I run a secondary DNS server I just get a copy of the zone from primary server and there is no point to flush cache. I can push the server update zone from the primary server by deleting the zone file and restarting your DNS service.

On Windows I have call next one:

> ipconfig /flushdns

Thursday, 27 August 2015

Sleep() in JavaScript

"What do I do if I need a Sleep() function in JavaScript?"
I have a JavaScript code that I need to add a sleep() function to. The code I am running is already in a function, eg:
function myFunction(time)
    alert('time starts now');
    //code to make the program wait before continuing
    alert('time is up')
Well, JS does not have a sleep function, it has setTimeout() or setInterval() functions.
The code would be:
var timeoutID = window.setTimeout(func, [delay, param1, param2, ...]);
var timeoutID = window.setTimeout(code, [delay]);
The delay is given in miliseconds (see or

See example here:

This won't halt the execution of your script, but as long as setTimeout() is an asynchronous function, this code
    console.log("THIS IS");
}, 2000);
will print this in the console:
*(note that ME is printed before THIS IS)
function sleep(ms) {
    ms += new Date().getTime();
    while (new Date() < ms) { }
now, if you want to sleep for 3 seconds, just use:

Please note that this code will keep your script busy for n milliseconds. This will not only stop execution of Javascript on your page, but depending on the browser implementation, may possibly make the page completely unresponsive, and possibly make the entire browser unresponsive. In other words this is almost always the wrong thing to do.
If you do sleep more than 10 seconds, browser shows alert: "A script on this page may be busy, or it may have stopped responding. You can stop the script now, open the script in the debugger, or let the script continue."

Friday, 15 May 2015

How to format text in Skype

Today I found out some features of the Skype chat that must have sneaked in the last versions, since nobody has posted about it yet. I was having a hard time when pasting text into the chat which contained character that were easily misinterpreted as emoticons, e. g. (0) as well as using basic text formatting like bold, italic or strikethrough.

A * serounding text (*a*) bolds.
A _ serounding text (_a_) italics.
A ~ serounding text (~a~) strikethroughs.

If you start a message with "@@ " (two ats with a space), every formatting function in your message will be ignored except emoticons.

If you start a message with "!! " (two exclamations with a space), every formatting function in your message will be ignored and font will be switched to monospaced.

So here is my findings:
boldThis is *bold* text
italicAnd this _italic_
strikethroughAnd ~strikethrough~
no text formatting fullAnd full message @@ *no text formatting* but emoticons :D
plain text fullAnd full message !! no text formatting, no emoticons, monospaced
plain text inlineAnd inline {code}no text formatting, no emoticons, monospaced{code}

Monday, 30 March 2015

Replacing a standard WelcomeDlg with a custom one.

We all sometimes looking for solution how to customize the standard dialog in Windows Installer XML (WiX).


Usually we can easy select any of WiX standard dialog sets, from the WiX UI assembly. It could be one of these sets:
        <UIRef Id="WixUI_Minimal" />
        <UIRef Id="WixUI_Advanced" />
        <UIRef Id="WixUI_FeatureTree" />
        <UIRef Id="WixUI_InstallDir" />
        <UIRef Id="WixUI_Mondo" />
I selected one of them, it was WixUI_InstallDir dialog set. In case when I want add a new dialog I just following the manual on the WiX Toolset site where described how to customize the WixUI Dialog Sets.
It is not very hard.
As result I got a Welcome dialog:

On this dialog I see Major.Minor version of my "Super Product". But I want more...
I want to see which version of this product will be installed exactly. In the same time I don't like to change my Product Name for whole project.
    <Product Id="*"
Well, to avoid this I will replace my Welcome dialog with a custom one.

Replacing the first dialog

Replacing any dialog of this set is not problem, so lets do it. First of all I checked the first-time install dialog sequence. To do it I downloaded the source code of WiX. It's an open source project located on SourceForge. Once that's done, I located the file WixUI_InstallDir.wxs in the source folder (currently it is here \src\ext\UIExtension\wixlib\). So it is a sequence:

  • WixUI_WelcomeDlg
  • WixUI_LicenseAgreementDlg
  • WixUI_InstallDirDlg
  • WixUI_VerifyReadyDlg
  • WixUI_DiskCostDlg

Then I copied the original WelcomeDlg code into my project, gave it a new id, then made some modifications. I replaced InstallUISequence from
                <Show Dialog="WelcomeDlg" Before="ProgressDlg" Overridable="yes">NOT Installed OR PATCH</Show>
to my custom file name (new id)
                <Show Dialog="CustomWelcomeDlg" Before="ProgressDlg" >NOT Installed OR PATCH</Show>

Then I fixed up Back/Next buttons on neighboring dialogs so they ended up at my dialog instead of the built-in ones:
            <DialogRef Id="CustomWelcomeDlg" />
            <Publish Dialog="CustomWelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg">1</Publish>
            <Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="CustomWelcomeDlg">1</Publish>

So, currently I initiated my CustomWelcomeDlg before ProgressDlg, and published new events for buttons on both dialogs Next for CustomWelcomeDlg and Back for LicenceAgreementDlg.

Now when I will run my Setup.msi I should got a new Welcome dialog. And of course I could not avoid some problem: all looked great, but after I pressed "Install" button I got a new window with an old Welcome dialog.

I don't want to describe all my steps to find a solution of this problem, just want to show how it could be fixed. So, I added a new row into InstallUISequence, where turned off event to show original Welcome dialog:
                <Show Dialog="WelcomeDlg" Before="ProgressDlg" Overridable="no">0</Show>
                <Show Dialog="CustomWelcomeDlg" Before="ProgressDlg" >NOT Installed OR PATCH</Show>
So as a result of my manipulations I got a Welcome dialog with some customization:
Work is done.

Interesting links to documentation about WiX.

Monday, 5 January 2015

Разрушение мифов: Голубь птица мира

Существует много мифов и легенд о птицах, но это все ерунда: многие из них совершенно не соответствуют действительности.

Трогательный белоснежный голубь стал символом мира с легкой руки Пабло Пикассо.

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

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

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

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

Вот два видо, где голуби убивают своих собратьев:

Еще видео

Голуби добивают больного голубя
Голуби дерутся
Даже голуби аки волки теперь добивают ослабшего...

Ссылки на другие источники

Голубь — птица кроткая?

Wednesday, 17 December 2014

Как я пытался купить подарок в магазине "Алло", или история одного магазина.

Второй раз сталкиваюсь с этим магазином и с непросветной глупостью персонала и второй раз говорю себе: "Хватит!". Очень надеюсь, что этот раз будет последним.
Решил купить подарок жене на праздник. Предполагая возможные проблемы, основываясь на предыдущем негативном опыте, начал договариваться заранее. Итак...

День 1й (вторник, 25 ноября)

Зашел на сайт магазина, выбрал интересующий меня телефон и нажал кнопочку "Купить в 1 клик", внес свой номер телефона и стал ждать обратного звонка.

Прошел час, затем второй, мне так никто и не позвонил...

Тогда я набрал их номер со своего мобильного. Трубку поднял оператор, который запросил информацию обо мне, уточнил что я хочу купить и порекомендовал дополнительные аксессуары, с чем я согласился. Договорились, что я буду оформлять кредит через банк, а именно АО « Альфа-Банк». Запрос в банк должны были передать после того как выспросили с меня еще кучу информации.  Я уточнил, что заказ нужен мне не просто так, а к конкретной дате и поскольку он оформляется как кредит, то прошу привезти его пораньше, не дожидаясь согласования с банком, или свести этот период до минимума.

День 2й (среда, 26 ноября)

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

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

В течении получаса я получил смс уведомление о том, что мой заказ оформлен.

День 3й (четверг, 27 ноября)

На следующий день, не допуская что бы ситуация пустилась на самотек, я перезвонил оператору что бы уточнить, когда со мной свяжется представитель "Альфа-Банка". Оказалось, что оператор не знает что и когда будет и дал мне телефон банка, куда я должен позвонить что бы узнать эту информацию.

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

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

День 4й (пятница, 28 ноября)

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

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

Так мне и не удалось оформить все необходимое за одну неделю.

День 7й (понедельник, 1 декабря)

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

В обед, служащий банка перезвонил мне, уточнил еще раз всю информацию и рассказал о условиях кредитования. Выходило так, что я должен буду оплатить разовую страховку кредита в размере 1% от выданного кредита, начисление же % по кредиту составит 2% и будет начисляться со второго месяца. Для моего случая - идеально, так как мне нужен был кредит на неделю (только что бы занять товар до момента поступления денег на мой счет). Этот работник сказал, что отправит ее на рассмотрение в кредитную комиссию.

Максимально, рассмотрение кредитной комиссией осуществляется за 8 часов, по окончании рассмотрения комиссия либо одобряет выдачу кредита, либо отказывает, но в любом случае еще один день сгорел.

День 8й (вторник, 2 декабря)

Утром, часов в 10 мне позвонили, и сказали, что комиссия по кредитам одобрила мою кандидатуру и банк готов выдать мне кредит, курьер готов привезти все необходимые документы только завтра, так как у него уже все расписано на сегодняшний день. Я еще раз напомнил, что мне нужно бы максимально быстро, так как магазин не будет заниматься доставкой товара пока не получит от банка подтверждение, которое они не смогут дать, пока я не подпишу договор. Таким образом после подписания договора завтра они смогут дать ответ в магазин и в лучшем случае магазин направит запрос на перемещение товара из другого города только тогда, плюс минимум день на перемещение  и будет хорошо, если я смогу получить его на этой неделе, хотя вся эта каша заварилась еще в начале прошлой. На что в ответ я получил твердое "НЕТ", о том, что ускорить все это нельзя никоем образом.

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

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

Я попросил сделать перемещение как можно раньше, так как я уже готов платить налом, и как только переместят товар, я его возьму. На удивление оказалось что весь товар (тут мы быстро сверились по списку) уже перемещен в Киев и дожидается меня. Я попросил, что бы его переместили в магазин на Петровке.

После чего меня как всегда заверили что все ОК, и на этом мы распрощались.

День 9й (среда, 3 декабря)

Не ожидая подвоха, первый звонок я совершил ближе к вечеру, чтобы уточнить о том доставлен ли мой товар в указанный мной магазин. Вот тут и начались ПРОБЛЕМЫ, да именно так большими буквами.

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

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

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

День 10й (четверг, 4 декабря)

Проблемы начались с самого начала, когда жена перезвонила днем в магазин, то оказалось, что там товара нет.

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

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

Перезвонили в течении получаса. НО, оказалось, что такого товара уже нет в наличии, поэтому мою заявку вообще закрыли. Никакие возражения не приняли.

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


Узнал каким образом подать жалобу, подал на этом все и закончилось. Так до сих пор со мной никто и не связался из магазина и не объяснили куда пропал товар, который был под меня зарегистрирован и даже доставлен в магазин.

После этого я зашел в другой магазин, купил товар и никаких проблем.

Хотите проблем - пользуйтесь услугами магазина "Алло"!