pavki/hr_qa_sbs_best_bad huggingface dataset:
Вопрос: Nginx сайты на одном ip?

Лучший ответ: 1. Для понимания того как Nginx обрабатывает запросы обязательно почитайте это
2. Так же обязательно определите default_server, например в файле /etc/nginx/conf.d/fallback.conf (путь может меняться, см. include в nginx.conf) можно написать:server {
        listen XX.XX.XX.XX:80 default_server;
        server_name _;
        return 444;
}
default_server пригодиться для обработки неправильных запросов, например запросов без поля "Host"
В моем примере чуть выше nginx просто будет закрывать соединение для таких запросов, для этого служит спец. код 444.

Худший ответ: Если всё именно так как Вы сказали, то всё должно работать. Но я так понимаю Вы много чего упустили. Скините конфиги подскажу где запинаетесь.
Вопрос: 2 операционной оси на одном диске как установить?

Лучший ответ: А надо было сначала винды ставить. Серьезно. Вы сейчас винды установите, а она - загрузчик линуха похерит.

Худший ответ: 1.  Выделить ей место с помошью кали. 
  *Если кали сьела не весь диск:
  parted /dev/sda  и сделать раздел в свободном месте. 
  mkpart primary ... - если в основном 
              extended если в расширенном разделе.       
  *Возможно /home монтируется что то большое, можно его уменьшить и остатки места отдать винде. 
    Посмотри /etc/fstab. Может быть придется грузится с флешки.   2. *перенести кали на флешку или диск (dd if=/dev/sda of=/dev/sdb conv=noerror,sync ) разметить под себя и залить    обратно. 
   *перенести упаковав в tar:
        Залить на cd, в какой то раздел (swap:), или флешку  gentoo install live cd, pappyrus, ... 
        Загрузится с него/
        cd /home/my_clone_of_kaly
        mount /dev/sda? /mnt/KaliDisk1
        tar -cf kali.tar /mnt/KaliDisk1/* -p --preserve-permissions --acls --xattrs
       переразметить диск на обе оси. 
        распаковать kali где ей надо жить 
        mount /dev/sda? /mnt/KaliNew
        cd /mnt/KaliNew        
        tar -xf  kali.tar -p --preserve-permisions --acls --xattrs    3.Поставить(kvm) qemu+libvirt
      создать вертуалку, дать ей disk в формате raw, поставить в ней винду. 
      залить куда она должна пасть. 
      dd if=/home/vistpc/MyWin10.img of=/dev/sdb1 offset=... count=... conv=...
    или 
      mount /home/virtpc/MyWin10.img /mnt/img
      mc, скопировать с атрибутами (но не факт что прокатит, это не 98:) 
   прописать ее (винду) в граб (но он должен уметь уефи).       4. Загрузится с флешки. 
    сделать еше один граб  
       parted /dev/sda
       mkpart ...  например выдав ему немного из swap .   
       quit    
    поставить или скопировать граб с первого раздела (dd) или вручную.
    или поставить его туда и скопировать файлы его настроек. 
    поставить флаг загрузки с него  
       parted /dev/sda
       set 2 boot on (у grub2 может быть иначе) 
       quit
    сбросить флаг загрузки (чтоб винда нечего не прознала)
    Можно выделить в начале место для винды (100МБ). 
    Ставить винду (не давая ей угробить диск). 
    Перезагрузитья с с флешки.  Востановить флаг загрузки на sda2 (например). Прописать в нем оби оси.
    Смотри по pappyrus, как она запускает винды  
      title Win
      map (0,1)
      bootmgr...sda1 - windows boot loader (efi)
    sda2 - grub2(efi) при выборе Windows grub передаст загрузку на sda1 
                      при выборе Linux запустит ее. 
    sda3 - windows10 
      sda4 - exetnded 
      sda5 - linux (/)
      sda6 - swap 
      sda7 - home 
      ....5. Записать из граба как запускается кали. 
    Поставить винду.
    С флешки снести sda1 где bootmgr.  
       grub> root (hd0,0)
             install ....
    Поставить с флешки граб и прописать в нем обе оси (руками если не найдет).
 короче творческий процесс:)
Вопрос: Можно ли один раз использовать глобальную переменную?

Лучший ответ: Странно, в тексте упоминается объект $pdo, а в коде статический вызов, у которого никаких проблем с видимостью в принципе быть не может.
Но есть отвечать буквально, то 
1. Если код процедурный, то global для $pdo или статический вызов через DB:: - это нормально. Если код объектный, то передавать $pdo  как параметр в конструктор, присваивать локальной переменной класса и потом уже использовать только ее.
2. В данную конструкцию никакая инъекция не пролезет
Писать, кстати, можно короче, чтобы не канителиться.$data = array(
  'email' => $_POST['email'],
  'id' => $_POST['id']
);
$res = DB::prepare("UPDATE `users` SET `email` = :email WHERE `id` = :id")->execute($data);

Худший ответ:  Глобальными переменными не гнушаются и гранды. Я бы только подумал чтобы вынести все в отдельный файл.А то как же ;-) Кто фильтровать ввод будет?
Вопрос: Как сделать перетаскивание мышкой аналогично Google или Yandex картам?

Лучший ответ: https://github.com/kentor/jquery-draggable-background
Пример: kentor.github.io/jquery-draggable-background

Худший ответ: jQuery drag&drop. 
В сети полно примеров:
jsfiddle.net/GRDww/40
https://jsfiddle.net/ChrisStanyon/6v5TK/
https://jsfiddle.net/gabrieleromanato/CwqGu/
Вопрос: Как перенести бд mysql?

Лучший ответ: Ну да. В идеале, на новой ОСи должен стоять мускул такой же версии, раз уж вы бинарные файлы переносите.

Худший ответ: ну и еще по мимо этого наод бы скопировать конфиги мускула из /etc
Вопрос: Как эмулировать множественное наследование в php с помощью функции __call()?

Лучший ответ: Это та самая PDF-ка, которая еще в 2012 была странноватой и местами устаревшей?
__call() - это не функция а магический метод, который вызывается при попытке вызвать несуществующий метод у объекта. Теоретически, можно в нем прописать обращение к методам из других объектов, но кому в здравом уме это может понадобится - не представляю.
Тем более, что все в том-же 2012 появились trait'ы.

Худший ответ: 1) В php можно наследовать несколько интерфейсов
2) Для каждого интерфейса можно создать отдельный трейт
Реализация через метод __call - это глупая и бесполезная идея.
Вопрос: Что надо для того, чтобы игра не провалилась?

Лучший ответ: Вообще на это влияет много факторов. 
Один из них это жанр.
К примеру вспомните когда вышла "DayZ Standalone". В тот год как с конвеера поехали игры зомби жанра. Потому, что народ подсел. Вполне возможно, что зашёл бы людям какой либо платформер в этом жанре. А так же заметьте, как только выходят популярные игры, на них выходят клоны ( это законно, так как исходники разные ) и нередко клоны завоёвывают сердца людей.
Так же стоит учесть, что будет интересно людям на протяжении дня, в дороге, на работе ( в перерывах конечно же ). Чаще всего люди выбирают простенькие игры, где не надо развиваться. Просто покликал прошёл уровень, поставил рекорд - убил время.
Немало важным будет внимание дизайну. Люди выбирают по обложке.
Таблица рекордов. У людей в крови соревноваться.
Разные персонажи. 2012 год подарил нам новую CS'очку, а с ней в комплекте шли скины. А теперь в 2к18'ом игроки просто помешаны на них. Так же в играх мы видим разных персонажей, предметов. У них есть редкость, что пробуждает азартность людей. Ну и кому бы не хотелось покрасоваться редким мечом, трофеем выбитым из последнего Босса.
Можно и дальше перечислять подобные факторы, влияющие на людскую психику и восприятие. Целая статья получится :)
Думаю азы я донёс до Вас. Удачи в продвижении!

Худший ответ: Во первых - нужен интересный гемплей, качество графики и звуков. По факту на это влияет много факторов, которые ещё зависит и от самого геймплея.
Во вторых - нужны финансы для рекламы своего творения. При чём здесь играет не одноразовое вливание денег на рекламу, а постоянное. Кстати, ещё и качество этой рекламы может сыграть злую шутку.
В третьих - постоянные обновления игры. Это позволит пользователя снова заинтересовать, если игра уже пройдена или уже его наскучила.
В третьих, хотя это можно было засунуть в первый пункт - это баланс. Благодаря балансу строится и экономика (не для всех игр).
PS: Много факторов влияет на то, как будут пользователи относиться к продукту и как она будет популярна. На врятли здесь вы что-то узнаете, но над этим стоит задуматься заранее.
Вопрос: Какую связку выбрать для сайта домен-хостинг?

Лучший ответ: На мой взгляд, по цене и качеству оптимальна следующая связка: зарегистрировать на reg.ru, направить на pdd.yandex.ru (в reg.ru можно сразу при регистрации домена выбрать DNS Яндекса из выпадающего списка), а оттуда направить на хостинг beget.com (т.е. указать в редакторе DNS Яндекс.Почты IP-адрес хостинг аккаунта). Аргументы в пользу такого выбора у меня следующие:Reg.Ru один из старейших аккредитованных регистраторов в РФ, у них куча удобных инструментов и саппорт адекватный. При этом есть возможность получить статус партнера и партнерские расценки, пополнив баланс на не такую уж крупную сумму (например, чтобы получить возможность продлевать домены в российских зонах по 119 рублей нужно пополнить на 6 250, а потом написать им в саппорт, чтобы сменили тариф).Яндекс.Почта - полностью бесплатна, удобна и настройки DNS очень быстро обновляются при редактировании. А аккаунт на Яндексе нужен в любом случае, чтобы добавить сайт в Яндекс.Вебмастер и отслеживать его позиции в поиске Яндекс.Beget тоже проверенная временем компания, у них есть бесплатный хостинг, круглосуточный саппорт, возможность гибкой настройки PHP без обращений в саппорт, куча их собственных фишек в плане безопасности (например, изоляция сайтов на аккаунте и интегрированная в их панель управления проверка на вирусы скриптом AiBolit). И, при всем этом, на платных тарифах у них цены существенно ниже, чем у конкурентов (включая reg.ru).

Худший ответ: Очень часто у хостеров есть такая услуга, что при оплате за год, доменное имя даётся "в подарок". Мне нужен был виндовый хостинг, я выбрал 1gb.ru - проблем не было. Хотя я так же пользуюсь DNS от яндекса pdd.yandex.ru - лучше, чем днс от хостинга, и почта гораздо лучше (и проще), чем почта хостинга
Вопрос: Стеганография на картинках?

Лучший ответ: Если стеганографию можно обнаружить, то это не стеганография.
Иными словами: никак.

Худший ответ: Можно применить программу для извлечения файла из картинки. Если получилось извлечь какой-нибудь файл в известном формате типа zip, то это очень надежное доказательство того, что стенография есть.
То есть ответ: нужно найти программу, которой файл был помещен в картинку, или хотя бы подобрать алгоритм, чтобы написать свою программу и тем самым проверить.
Вопрос: Как сделать такую анимацию на сайте?

Лучший ответ: Используйте mix-blend-mode
snippet

Худший ответ: Используйте mix-blend-mode
snippet
Вопрос: Что может быть с железом?

Лучший ответ: Недостаточная мощность, купите новый БП
20pin на материнку используется только на очень старых БП. Сейчас используется обратно совместимый в 24pin.
Аналогично с CPU, раньше использовали 4 pin, сейчас перешли на 8pin. Так же обратно совместимые. 4pin разрешается использовать если CPU не будет разгоняться

Худший ответ: 20 + 4 это доп. питание?
Вопрос: Как работает позднее связывание в Python?

Лучший ответ: Чтобы такого не происходило можно сделать так:def multipliers():
  return [lambda x, i=i: i * x for i in range(4)]
    
print([m(2) for m in multipliers()]) # [0, 2, 4, 6]
или такdef multipliers():
  return (lambda x: i * x for i in range(4))
    
print([m(2) for m in multipliers()]) # [0, 2, 4, 6]
Второй вариант в данном случае мне нравится больше.
Но первый - универсальное решение для всех подобных проблем с лямбдой.

Худший ответ: Тоже долго ломал голову над этим примером и даже предыдущий ответ не сразу помог мне осознать как всё работает. Дело в том, что i воспринимается как глобальная переменная по отношению к создаваемой лямбда функции, т.е. в лямбде фигурирует не значение i, а ссылка на неё.
После того, как созданы все лямбды,  i равна 3. Вот и получаем массив одинаковых значений.
Вопрос: Как грамотнее и лучше обозначать методы и свойства JS?

Лучший ответ: В javascript-e принято писать camelCase

Худший ответ: Свойства и переменные camel cas-ом с маленькой буквы. Классы - с большой. Если метод возвращает или задает значение -название начинается с get и set соответственно: getValue(), setValue(val)).
Иногда можете встретить название свойства класса начинающееся с подчеркивания: _property - так принято обозначать закрытые свойства в ООП.
Константы большими буквами с подчеркиванием: SOME_CONSTANT_VALUE
Вопрос: Как на Тостере смотреть вопросы по уровню сложности?

Лучший ответ: В данный момент действительно никак. Эту функцию Вы увидите чуть позже.

Худший ответ: Очевидно никак.
Вопрос: Безопасно ли держать провода в собранном виде?

Лучший ответ: На звук это настолько слабо повлияет, что даже приборами будет сложно засечь.
А вот нагруженные силовые кабеля так лучше не складывать. Если свернуть кольцами удлинитель и подключить что-то мощное, типа электрообогревателя, то можно заметить как эти кольца будут греться. Иногда до расплавления дешевой изоляции → короткого замыкания → пожара.

Худший ответ: А моим наушникам уже лет 9-10. И у них часть провода просто тупо затвердела. Вообще не сгибается.
Причем это как-то связано с руками. Там где больше брал -- там тверже.
Вопрос: Почему папка весит 0 байт?

Лучший ответ: 1. зависит от файловой системы.
2. 0 байт вам показывает кто? Не каждая программа ковыряет на таком уровне, чтобы учитывать размер всего, где лежит информация про файл и про папку. Попробуйте другие программы. В Линуксе стандартный ls сразу будет показываьт, что папка занимает как минимум 1 блок (сейчас это обычно 4 кб).
3. Для файлов - тоже самое, если у вас есть файл в 5 байт, у него где-то есть название, аттрибуты доступа, сектор в котором он лежит, но ваша программа это не показывает.
Вывод, пустая папка весит не 0 байт, но подобная информация не для пользователя, а для администратора, который учитывает занятое место специальными программами, с учетом понимания как устроена файловая система.

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

Лучший ответ: Поддерживаю Дмитрий Кузнецов, либо на флексах и сетку и сами колонки делать, чтобы сами колонки растягивались по максимальной в ряду, и внутри колонки сама фотка расстягивалась на большу часть. Но тут есть нюансы, при появлении многострочного текста.
Я бы все же сделал фиксированную область под фотки (пропорциональная и квадратная), а само изображение отцентровать в этой области и не давать ему растягиваться большой любой из сторон этой области. Тем самым все блоки с фотками будут одного размера. Пример

Худший ответ: Как я понял, у вас изображения разных размеров. От сюда следует либо делать изображения одного размера, либо использовать flex.
...у меня всё)
Вопрос: Upwork — проекты по копированию/выкачке сайтов. Стоит ли браться?

Лучший ответ: Хтмл и цсс не являются объектом авторского права

Худший ответ: Вы спрашивайте "я правильно понимаю, это ваш сайт?"
Но вообще, тут надо смотреть лицензионное соглашение викса.
Я например копирую сайты на Вордпресс, и общаюсь с клиентом так, что считается по умолчанию что это его сайт, и он просто хочет нормальную ЦМС. 
Проблем возникнуть не должно, если именно с таким прицелом работать, считая что это клиент пределывает СВОЙ сайт.
Вопрос: Как написать email в поддержку Yandex?

Лучший ответ: Как написать email в поддержку Yandex?Ничего сложного в этом нет.
Просто Яндекс как и любая крупная компания с огромным числом пользователей старается минимизировать обращения к сотрудникам поддержки.Инструкция -
1)На странице сервиса с которым возникли вопросы  ищите кнопку "помощь" она располагается как правило в нижнем правом углу страницы.
2)По этой кнопке попадаете в раздел помощи, где перечислены основные проблемы - выбираете нужную проблему и читаете возможные решения проблемы.. Вероятнее всего там вы найдете все ответы, если будете внимательны.
Но если этого не произошло - внизу страницы с популярными решениями проблемы будет что-то вроде такой ссылочки:
Нажимаете ее и появляется форма обратной связи.
Суть в том что пока вы не пройдетесь по популярным ответам, и не прочитаете их в техподдержку вы не попадете.
А если уж реально все просмотрели и ответа на вашу проблему нет - тогда вы найдете эту кнопку без труда.

Худший ответ: На данный момент форма обратной связи для "Почты для домена" от Яндекса находится вот здесь:https://yandex.ru/support/pdd/troubleshooting/mail...
Вопрос: Свой класс элементам the_content()?

Лучший ответ: Например, такadd_filter( 'the_content', 'my_the_content' );
 
function my_the_content( $content ) {
    return str_replace('<ul', '<ul class="list2"', $content);
}
Но, помоему, проще обернуть контент<div class="content">
    <?php the_content(); ?>
</div>.content ul {
    /* стили */
}

Худший ответ: 1. Хукаетесь в фильтр the_contentadd_filter( 'the_content', 'add_class_to_list' );
2. Фильтруете контент и добавляете класс:function add_class_to_list( $content ) {

    // тут выполняете манипуляции на $content

    return $content;
}
Есть три базовых варианта как выполнять эти "манипуляции":
2.1 Заменой подстроки
2.2 Полноценной работой с DOM
2.3 Регулярными выражениями
Далее привожу первые два варианта, по порядку:// 2.1 - Заменой подстроки
function add_class_to_list( $content ) {

    // Находим <ul> и меняем на <ul class="list2">
    $content = str_replace( '<ul>', '<ul class="list2">', $content );

    return $content;
}
add_filter( 'the_content', 'add_class_to_list' );

// 2.2 - Работой с DOM
function add_class_to_list( $content ) {

    $doc = new DOMDocument();

    // далее все необходимые манипуляции, подробности работы с DOMDocument - в документации:
    // http://php.net/manual/en/class.domdocument.php

    return $content;
}
add_filter( 'the_content', 'add_class_to_list' );
DOMDocument полезен, когда нужно выполнять больше работы - оборачивать в дивы и тд. Регулярки бывают полезны если надо поймать вариативные данные, которые невозможно захватить с помощью str_replace.
Вопрос: Как забрать id из input через js?

Лучший ответ: var course_id = document.getElementsByName("courseid")[0];
var value = course_id.getAttribute("value");
alert(value);
https://jsfiddle.net/whata/yftamdud/
1. Вы не следите за названиями переменных, У вас сначала course_id, потом вы пытаетесь взять id из courseid, и в alert вывести id, вместо value.
2. Метод  getElementsByName возвращает массив элементов, т.к. getElementsByName

Худший ответ: Ну как минимум там какая-то ерунда с названиями переменных, в приведенном примере.
Во-вторых советую изучить learn.javascript.ru/document
Вопрос: Как оптимизировать 34 регулярных выражения для букв русского алфавита в 1?

Лучший ответ: Использовать backreference
попробуйте как-то так:
re:([а-яА-Я])\1{2,}|\1\1\1

Худший ответ: re:([а-яё])\1{2,}
Вопрос: Передача функции — шаблоны или std::function?

Лучший ответ: Первый вариант:template<typename Func> void MyFunc (const Func & otherFunc);
Гарантирует, что otherFunc будет заинлайнена в MyFunc, то есть такой вариант предпочтителен там, где требуется максимальная производительность. Но шаблонные функции не могут быть виртуальными. То есть такой вариант очень хорошо подходит для функций-утилит, и плохо подходит для методов публичного API и на границах модулей, так как там как раз инлайн не нужен, а нужны виртуальность и сокрытие реализации.
Важное замечание! Приведённый код не совсем корректен, всегда в таких случаях используйте передачу по универсальной ссылке:template<typename Func> void MyFunc (Func&& otherFunc);
Такой вариант покрывает и константные функторы, и те, которым необходима мутабельность для работы. Если вы планируете сохранить функтор, то это ещё и позволит воспользоваться perfect forwarding -- по сути, единственный способ, корректно работающий с любым переданным функтором:field = std::forward<Func>(otherFunc);
Второй вариант:void MyFunc (const auto & otherFunc);
Можно использовать, если вам не нужен тип функтора. По сути он эквивалентен предыдущему.
Третий вариант:void MyFunc (const std::function<void()> & otherFunc);
Возьмите отрицание моих предыдущих аргументов и примените сюда. Можно использовать с виртуальными функциями, больше подходит для API, но теряет в производительности. А именно, вызов otherFunc эквивалентен вызову виртуальной функции.
Четвёртый вариант:void MyFunc (const void (&otherFunc)());
Работает только с простыми, глобально определёнными функциями. Вместо этого практически всегда стоит использовать std::function.

Худший ответ: Наверное, в STL максимально поддержан старый стандарт, поэтому там шаблоны.
std::function, более очевиднее, а удлинённость можно исправить лаконичностью -typedef.
Излишняя универсальность может стать проблемой, хотя это больше вкусовые штуки.
Вопрос: Какой плагин лучший? ACF, CMB2, Pods, MetaBox?

Лучший ответ: Года 3 как юзаем ACF Pro. Пока не столкнулись ни с чем, с чем он бы не справился. Остальное не пробовал, и нет желания пробовать.

Худший ответ: Топы по тегу WordPress, не ругайтесь что вызываю вас напрямую) 
Интересно ваше мнение!
Денис Янчевский Игорь Воротнёв Краб Анархист WP Panda azerphoenix WordPress WooCommerce Павел Иван Козлов Roman
Вопрос: Кроме реалтек usb аудио еще существует?

Лучший ответ: Что конкретно интересует?
Производители карт или производители аудио процессоров?
Если карт то как минимум
ALVA
Akai
Alesis
Apogee
Arcam
Asus
AudioQuest
Behringer
Boss
Cambridge Audio
Creative
Denon
Dynamode
ESIO (Egosystems)
Fender
FiiO
Focusrite
IK Multimedia
Korg
Line 6
M-Audio
Mackie
Manli
Marantz
Numark
Onkyo
Peavey
PreSonus
Pro-Ject
RME
Resident Audio
Roland
Steinberg
TC Electronic
TEAC
Tascam
Yamaha
Zoom
если процы то там вообще только мёртвые их не клепают, только китайских десятка два наберется.

Худший ответ: Всмысле звуковая карта? Конечно. Creative как минимум.
https://market.yandex.by/search?clid=545&cvredirec...
Вопрос: Как сделать такой эффект прокрутки?

Лучший ответ: Как сделать эффект перелистывания как на руофе Lineage?

Худший ответ: Разделить экран на 2 части и повесить на скролл функцию - смещать один элемент вверх на -100vh, а другой вниз. Ну и убрать скролл через overflow:hidden.
Вопрос: Какой бюджетный ноут взять для учёбы на программиста?

Лучший ответ: Общий принцип -
Процессор в районе core i3
Памяти не менее 8гб. Однако во многих случаях дешевле купить компьютер с минимумом памяти, потом добавить.Диск - SSD в обязательном порядке!. Опять же в большинстве случаев дешевле купить с обычным диском и поменять или добавить SSD.
Видеокарта - хватит встроенной. Кое где средние не вытянет, но тем не менее.
При покупке внимательно смотреть на возможность добавления памяти и замены диска, не везде это возможно.
В остальном на вкус и цвет.В итоге я советую  вариант 2 плюс докупаете SSD, и ставите его на место CD-ROM.
В тридцать уложитесь
Или такой плюс докупаете SSD на 256Гб.
Но по ценнику уже где-то в 36-37 вылезет.

Худший ответ: Linux встанет на любой)
за 30 можно и бу macbook найти в идеале (если очень много фотошопа то я бы рассматривал его)
Вопрос: Как применять TDD при написании кода?

Лучший ответ: Эта:
https://habrahabr.ru/company/piter/blog/326662/

Худший ответ: Суть TDD "на пальцах":
1. Написать тест на проектируемый кусок кода.
2. С успехом "провалить" этот тест.
3. Написать достаточно кода, чтобы пройти тест успешно.
4. Отрефакторить получившийся код.
И дальше все начинается сначала. Чтобы понять как это работает, предлагаю загуглить решение задачи FizzBuzz с применением TDD(на YouTube роликов полно, постов в блогах не меньше).
Дальше можно уже почитать литературу по тестированию. Я бы посоветовал сначала что-то фундаментальное по теме тестов, например, The Art of the Unit Testing.  Дело в том, что TDD это в первую очередь и одновременно "всего лишь" техника написания кода через тесты. И чтобы ее успешно применять, надо уметь писать эти самые тесты.
В этой книге найдёте много полезного про тесты и их концепцию. Советы по TDD также присутствуют.
Вопрос: Mikrotik. Проброс порта?

Лучший ответ: Второй то проброс напишите.

Худший ответ: пробросте 80 и 8000