Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Какие книги посоветуете для начального изучения программирования?

Лучший ответ:
Посмотрите на этот список от создателей hexlet.
Советую прочитать хотя бы по 1 книге в каждой категории. Вне зависимости от направления в котором вы будете развиваться дальше.

Худший ответ:
Начните тут: www.w3schools.com
Вопрос: Как самому сделать сетевой режим для игры?

Лучший ответ:
Есть игра "Змейка". Basic. Компьютеры нужно соединить соединить через LPT (ParNet Parallel cable).

Худший ответ:
Читаете базовое понятие о том как работает сеть.
Смотрите способы передачи информации по сети - в принципе сейчас в основном две - http запросы или socket.
Читаете как пользоваться библиотеками для вашего языка программирования.
Пишете.
P.S. Вопрос ваш слишком общий. Нужно конкретизировать.
Вопрос: Как лучше установить Linux для проведения практического курса по нему?

Лучший ответ:
Установить чистый линукс в виртуал бокс, скопировать куда-нибудь файлы виртуальной системы, после работы с линуксом в виртуал боксе сносить использованный нафиг и брать заранее сохраненную копию

Худший ответ:
Если в программе занятий нет упора на работу с железом - то самый простой способ - это виртуалка, которая со снапшота грузится каждый раз. В VB это вообще делается замечательно - я так прохождения игр пишу :)
Вопрос: Усовершенствование BEM или «ненужно»?

Лучший ответ:
Суть БЭМ не только в таком именовании, но и в том, что вы можете в любой момент взять любой блок, в любом сочетании и перенести в другое место и все будет работать. Никаких конфликтов, никаких коллизий имен, никаких зависимостей от областей видимости. В этом его сила.
Ну а избыточность описания легко исправляется инструментами сборки, которые сами соберут все эти длинные имена.
То что вы предлагаете, конечно тоже имеет право на существование. Используйте в своих проектах, если вам это подходит.

Худший ответ:
Уже года два так делаю. Проблем никаких.
Вопрос: Смогу ли я переактивировать OEM Windows 10 на другом пк?

Лучший ответ:
Если не активируется в автоматическом режиме - нужно будет связаться с службами MS, это называется "замена оборудования" https://support.microsoft.com/ru-ru/help/20530/win...

Худший ответ:
Фактически - никто не помешает. Если частное лицо, то идёт агрейд железа. По телефону точно активируют - проверено. Если контора, то в зависимости от документов. Вообще, OEM лицензия не запрещает делать модернизацию компьютера, в т.ч. и материнскую плату.
Вопрос: Как сделать api для микросервисов на php?

Лучший ответ:
api - слишком широкое понятие, как и зоопарк микросервисов на php. Поэтому Вы и не можете найти информацию. Это как искать "сделать что-то что будет обращаться куда-то, как-то получать данные от маленькой как-то написанной программы" Это ни о чем. Конкретизируйте задачу. О каких микросервисах речь, какой способ передачи данных по api (их немало, xml, json). Ну и наконец, что планируете использовать, так как это может быть любой язык программирования, в этом и суть api.
Если все это Вы и пытаетесь найти, тогда опишите саму задачу, например "делаю мобильное приложение, есть вот такое api, что лучше использовать".

Худший ответ:
Если сказать грубо, то API в общем понимание - это и есть набор микросервисов (далее МС).
Т.е., скажем у нас есть API для получения списка пользователей, тогда, в терминах МС, у нас есть МС "Список пользователей", цель которого следует из названия. Общая концепция - иметь минимальное количество качественных действий. Отсюда и его преимущества и недостатки ( https://ru.wikipedia.org/wiki/Микросервисы ) .
В целом по технологиям и стекам - вполне можно и на PHP, используя ту же Symfony/Silex/Slim/Equip и т.д. Тут, на чем удобно, то и используйте. Я вообще не слышал, чтобы разрабатывали конкретные решения под нужды МС.
Если смотреть на Java, я видел не мало примеров на spring-boot, на .NET - .net core думаю будет идеален (asp.net core).
В качестве протоколов обычно выбирается JSON, но никто не будет вас ругать, если вы будете использовать protobuf или вообще, что-то свое. У каждого свои нюансы, в общем.
Говоря про общие моменты, обычно, рядом с  МС всегда "употребляют" тот же Docker и автоматические средства развертывания. Т.е. по факту - МС, зачастую, цельный блок инфраструктуры, сразу же готовый для использования после автоматического развертывания.
UPD. Еще, крайне важный момент для МС - это мониторинг работоспособности. Нельзя им пренебрегать. На хабрахабре была не так давно целая статья про мониторинг.
UPD2. Шлюзом-аггрегатором может быть что угодно, более того, его может и не быть. Самый простой вариант шлюза - это NGINX, где можно сделать проксирование запросов, в зависимости от запрашиваемого URL.
Вопрос: Как избежать лимитов VK API?

Лучший ответ:
Зачем гадать, когда можно открыть документацию?
https://vk.com/dev/api_requests?f=3.1.%20Частотные...

Худший ответ:
Чтобы понять, в чём дело, смотрите ответы ВК на каждый запрос – есть ли там поле error. Пишите их в лог, чтобы можно было разобраться пост-фактум.
Чтобы избежать превышения лимитов при наплыве посетителей, не обрабатывайте запросы синхронно, а устройте очередь задач. Поступил запрос от посетителя – создайте задачу и сохраните её в очередь, а серверу ВК ответьте "ок" и больше ничего сейчас не предпринимайте. Другой процесс, постоянно работающий в фоне, пусть берет по одной задаче из очереди, обрабатывает и шлёт ответ пользователю. Пусть учитывает время трёх предыдущих отправленых вызовов к API ВК. И при необходимости, чуть ждёт, прежде, чем выполнять следующий.
Вопрос: Почему не меняется размер раздела LVM?

Лучший ответ:
Блочное устройство увеличили, ок. А файловую систему кто расширять будет? resize2fs, xfs_growfs и т.д. в зависимости от того, какая у вас ФС.

Худший ответ:
Не происходит потому что lvresize - это еще не все. Это только расширение тома. Теперь нужно еще и файловой системе обьянсить, что ее стало больше через resize2fs
Вопрос: Почему MSSQL называют SQL Server'ом?

Лучший ответ:
Потому что его создатели прямо так его и назвали Microsoft SQL Server.

Худший ответ:
потому что торговая марка зарегистрирована соответствующая
Вопрос: Как байтовый поток преобразовать в режиме реального времени?

Лучший ответ:
data = {"method": "startLiveview","params": [],"id": 1,"version": "1.0" }
with requests.post('http://192.168.122.1:8080/sony/camera', json=data, stream=True) as r:
    for chunk in r.iter_content(chunk_size=8192):
        # Делай что-то с куском в 8кб

Худший ответ:
два потока и очередь.
Один поток подключается к камере, выкачивает информацию, кладет ее в очередь. Второй поток забирает данные из очереди и делает с ними все, что ему скажете.
Вопрос: Как сделать экспорт в react\redux после запроса API?

Лучший ответ:
Сам вопрос поставлен вразрез с концепцией Redux, да и самой модульной концепцией JavaScript. Вам не надо пытаться экспортировать модуль после запроса, так делать нельзя. Вам надо задать начальное состояние и определить там ключи состояния isLoading, isError. При инициализации приложения произойдет запрос на сервер за данными и пока они не пришли isLoading будет иметь значение true,  вы, в идеале, в этот момент должны показывать пользователю прелоадер.
Ну, а то что вы пытались сделать это в корне не правильно.
При использовании redux-thunk должно получится, что-то вроде:import { fetchInitialDataApi } from './api';

const FETCH_INITIAL_DATA_REQUEST = 'FETCH_INITIAL_DATA_REQUEST';
const FETCH_INITIAL_DATA_SUCCESS = 'FETCH_INITIAL_DATA_SUCCESS';
const FETCH_INITIAL_DATA_ERROR = 'FETCH_INITIAL_DATA_ERROR';

const fetchInitialDataRequest = () => ({ type:  FETCH_INITIAL_DATA_REQUEST });
const fetchInitialDataSuccess = data => ({
  type:  FETCH_INITIAL_DATA_SUCCES,
  payload: data,
});
const fetchInitialDataError = error => ({
  type:  FETCH_INITIAL_DATA_ERROR,
  payload: error,
});

const fetchInitialData => async dispatch => {
  try {
    dispatch(fetchInitialDataRequest());
    const { data } = await fetchInitialDataApi();
    dispatch(fetchInitialDataSuccess(data));
  } catch error {
    dispatch(fetchInitialDataError(error));
  }
};

const initialState = {
  data: {},
  isLoading: false,
  isError: false,
  error: null,
};

export default function(state = initialState, action) {
  const { type, payload } = action;

  switch (type) {
    case FETCH_INITIAL_DATA_REQUEST:
      return {
        ...state,
        isLoading: true,
        isError: false,
        error: null,
      };
    case FETCH_INITIAL_DATA_SUCCESS:
      return {
        ...state,
        data: payload,
        isLoading: false,
      };
    case FETCH_INITIAL_DATA_ERROR:
      return {
        ...state,
        isLoading: false,
        isError: true,
        error: payload,
      };
  default:
    return state;
  }
}
Если же хотите получать начальные данные сразу и они статичные, то пишите их в шаблон страницы приложения в window._data и забирайте через reducer:export default (state = window._data) => state;

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

Лучший ответ:
а что вы хотите получить от http через телнет? Для какой либо отладки это очень неудобный инструмент. единственное для чего я например им пользовался это проверка работоспособности TCP протокола через кучу шлюзов. (когда пинг идёт, а связи нет)
telnet bbc.com 80 --- надо вводить в коммандной строке ОС, а не внутри самой утилиты телнета
потом когда подключение установилось надо написать чёнить типа "GET /" и нажать enter , букв видно не будет т.к. это не терминал, но какойто ответ от http вы должны увидеть

Худший ответ:
Телнет в винде есть, но он не установлен по умолчанию. Нужно его доустановить из компонентов, делается за 2 мин. в "Программы и компоненты"->"Включение/отключение компонентов Windows", нужно выбрать telnet клиент.
После того как поставите telnet, запускайте его как вы делали изначально, в консоли telnet дайте команду:
GET / HTTP/1.1
В результате получите корневую страницу сайта.
Вопрос: Сложный поисковый запрос к БД в Laravel. Как исключить удаленные записи?

Лучший ответ:
Написал на коленке, должно быть как-то так.->where(function ($query) use ($slug) {
    $query->where('name', 'LIKE', '%' . $slug . '%');
    $query->orWhere('short_description', 'LIKE', '%' . $slug . '%');
    $query->orWhere('description', 'LIKE', '%' . $slug . '%');
    $query->orWhere('meta_keywords', 'LIKE', '%' . $slug . '%');
})
->whereNull('deleted_at');

Худший ответ:
Примерно такwhere(function($q){
    $q->where('name', 'LIKE', '%' . $slug . '%')->
    orWhere('short_description', 'LIKE', '%' . $slug . '%')->
    orWhere('description', 'LIKE', '%' . $slug . '%')->
    orWhere('meta_keywords', 'LIKE', '%' . $slug . '%')->
})->whereNull()
Вопрос: Почему не могу создать папку Ubuntu?

Лучший ответ:
Вы наверное не только папку но и вообще писать на NTFS не можете.
Дело в том что вы не выключили Windows, а произвели гибернацию.

Худший ответ:
загружай винду обратно и запускай проверку диска
Вопрос: Что учить дальше(как стать полноценным хакером)?

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

Худший ответ:
Насколько я вас понял - вас интересует разбор именно программ. Эта сфера называется Reverse Engineering.
Посмотрите книгу Justin Seitz. Gray Hat Python. Python Programming for Hackers And Reverse Engineers - 2012 года.
А так же Денис Юричев Введение в reverse engineering для начинающих
Вопрос: Выбор мощного роутера для дома?

Лучший ответ:
Нужно одно устройство?
Тогда микротик, к сожалению, вычеркиваем. На нем установлена RouterOS, которая не умеет ни качать торренты, ни раздавать контент.
Из оставшегося голосую за zyxel. Первый keenetic работает 5 лет работает 24/7. За это время заменен блок питания (появилась просадка напряжения), и жесткий диск (на диск большего объема) без потери данных.

Худший ответ:
Берите ASUS RT-AC66U, с прошивкой мерлина будет идеально. Я свой настроил один и раз и больше не вспоминал
Вопрос: Как работать с API написанном на php из node.js?

Лучший ответ:
JsonRpc это всего лишь buzzword, обозначающий недоREST (ну или переREST) через http.
Устанавливаете superagent через npm и вперед:request
  .get('https://api.mystend.domain.zone/jsonRpc')
  .send({ query: 'dogById', id: '13' }) /* тут вот некий объект, описывающий запрос согласно спецификации, которую вам должны предоставить разработчики вашего "JsonRpc" */ 
  .set('X-API-Key', 'foobar') // Ну и заголовочки (авторизация там может или еще что)
  .set('Accept', 'application/json')
  .end(function(err, res) { // Тут ответ этого самого JsonRpc
    expect(res.dogName).toEqual('Brownie');
  });

Худший ответ:
Решение от Александра Марченко верное, ошибка была потому что стенд не с той веткой собирала...
Вопрос: Как сделать вывод меню. Yii2?

Лучший ответ:
1. структура базы должна быть зависима от ее дальнейшего использования, так что добавьте в нее столбец depth и не мучайтесь глупыми вопросами
2. меню как правило используется повсеместно, как следствие его кешируют. Так что просто делайте выборку всего меню, приводите к нужной структуре массив, загоняете в кеш, а потом оттуда дергаете то что нужно.
3. А зачем Вам keyword? Планируете совершить путешествие во времени и скормите его поисковикам из 90-х? И не совсем понятно чем у Вас отличаются h1, name и title. Как-то избыточно. Строк лишних в базу напихали, а 1 скромный smallInt столбец depth сэкономили.

Худший ответ:
Добрый день.
В вид Вы переходите по ссылке второго уровня?
Если да, то ориентируетесь на parent_id.
Запрос приблизительно такой:$model = Categories::find()->where(['parent_id' => 'id'])->all();
Вопрос: Используете ли вы видеозвонки при работе с зарубежными заказчиками?

Лучший ответ:
В видеозвонках только один минус - ваш рабочий кабинет)

Худший ответ:
А какие могут быть минусы? Только качество связи и знание языка для коммуникации.
Вопрос: Как лучше организовать рабочее окружение для веб разработчика?

Лучший ответ:
Начните с виртуалки, а там сами поймете

Худший ответ:
Я вот проходил эти пути... как бывший виндовый админ сижу в основном на винде (в т.ч. и сейчас), однако для разработчика всётаки лучше любая *nix система, будь то мак или линукс (сидел в каждом варианте как минимум по году)...проблем будет сильно меньше с ними чем с виндой
Мануалы все написаны под *nix, весь софт заточен под nix, без проблем конфиги только там работают
С чем сталкивался в винде:
1) Docker for windows  - у меня получилось взгромоздить только с 3-4 раза пожертвовав виртуалбоксом и поимев кучу граблей, когда после обновления винды он умирает вместе с hyper-v на базе которого работает (и жрет оперативку как не в себя)
2) Если вы случайно сохраните файл с конфигом/кодом с виндовыми переносами строк...будет забавно искать его...когда визуально всё ок, а ничего не работает и непонятно почему и где
3) Ещё веселее если в винде в git попадут два файла с одинаковыми именами в разных регистрах...я очень долго голову ломал почему в файле одно, а в стектрейсе другое...это вам не линух с регистрозависимой ФС
почему вернулся на винду: всётаки как бы ни кидались тапками линуксойды, но у винды более органичный gui, а жить в консоли и плакать от счастья я так и не научился (хотя и линуксовым админом успел довольно долго и успешно поработать)...и когда туда завезли WSL то вообще подавляющая часть проблем исчезла (кроме 3х выше)
по сему, если нет особого желания и познаний во внутренностях винды, надо сидеть на линуксе, это и полезнее и удобнее и меньше времени уйдет на поиск всяких странных косяков про которые не пишут в документации (потому что нормальные люди под виндой не пишут софт работающий в никсах)
Вопрос: Какую СХД купить?

Лучший ответ:
Либо сюда www.synology.su/products/126 (к примеру), либо самосборный на материнки .. допустим от супермикро

Худший ответ:
Если встаёт вопрос ограниченности бюджета, то лучше самосбор. FreeBSD+ZFS, плюс SSD-диск под L2ARC-кэш. Хотя это зависит от типа нагрузки, если будет в основном запись данных и мало чтения, то можно обойтись и без L2ARC.
Вопрос: Как правильно использовать middleware в Laravel?

Лучший ответ:
Нет. Хз в ларавел, но если там mvc, то данные запроса обратываются в контроллере, а middlaware там будет тем что стоит перед твоей обработкой в контролере. То есть например авторизация, мы в middlaware проверяем авторизован ли пользователь, если да, то передаем данные дальше на обработку в контролер. На практике их есть смысл заюзать если например пришел аналитик и сказал что если мы обрабатываем овощ, то надо выводить человеку сообщение: ты помидор, а у тебя куча контролер: картофанконтрлер, капустаконтролер, луккнотролер и т.п., и ты вместо того чтобы в них все вставлять сообщение ты помидор, добавляешь middlaware и в нем смотришь овощ ли это, и если да, то выводишь сообщение ты помидор.

Худший ответ:
Для валидации полей, есть валидатор
public function store(Request $request, StoreBlogTag $store)
    {
        $validate = Validator::make($request->all(), $store->rules(), $store->messages());
        if ($validate->fails()) {
            return redirect('post/create')
                ->withErrors($validate)
                ->withInput();
        };
        $tag = Tag::firstOrCreate([
            'title' => $request->input('title'),
            'slug' => Str::slug($request->input('title'), '-'),
        ]);
        $tag->save();
        return redirect()->back();
    }
Вопрос: Ide под Linux для Java разработки?

Лучший ответ:
Ну так вот вам Free Community версия для Linux
https://www.jetbrains.com/idea/download/#section=linux
Отличная IDE, хороший функционал за бесплатно, куча плагинов и фич.
Использую pycharm, datagrip, goland, phpstorm. Все стоит своих денег, аналогов особо нет

Худший ответ:
Ставьте смело Intellij IDEA
Вопрос: Как вставить csrf-токен в Ajax-запрос (метод jQuery $.post())?

Лучший ответ:
Я делаю вот так:
В главном layout'е в head добавляю<meta name="csrf-token" content="{{ csrf_token() }}">
В футере добавляю<script>
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });
</script>
Тем самым автоматом добавляя csrf токен ко всем будущим ajax запросам.

Худший ответ:
В общем, получилось вот такое (всё работает):
В HTML прописал в соответствии с доками ( https://laravel.com/docs/5.8/csrf#csrf-x-csrf-token )<meta name="csrf-token" content="{{ csrf_token() }}">
А в скрипте это выглядит примерно так:$.post({
		url: '/mypost',
		data: {'_token': $('meta[name="csrf-token"]').attr('content'), 'somefield': somevalue}
		}).done(function (data) {		
		alert('Успешно! ' + data);		
	});
и да, ВАЖНО:
в роутере должно быть прописано 
Route::post( ......
если там, например, 
Route::put( ....
- будет ошибка.
Хотя, может и можно заставить работать с PUT передав значение по аналогии с csrf-token, но мне уже вломы экспериментировать :D
Вопрос: Как сделать такой же слайдер?

Лучший ответ:
Вот что получилось при попытке мимикрировать слайдер. В коде можно видеть, что в свойстве window.isMobile лежит просто false; там конечно должна быть соответствующая функция.

Худший ответ:
Как такового плагина для слайдов нет. Для анимации там используется https://greensock.com/
Вопрос: Какую систему Вы используете для сбора и анализа статистики скорости генерации страниц?

Лучший ответ:
Мы из shutdown handler вызываем getrusage и результат отправляем в graphite, для визуализации - grafana

Худший ответ:
Сделайте мониторинг тем же PHP и собирайте статистику каждые 30 секунд к примеру. Потом стройте графики и смотрите параметры которые вас интересуют.
Вопрос: Как убрать категорию Uncategorized в WP?

Лучший ответ:
Назначьте другую категорию в качестве основной по умолчанию и тогда появится чекбокс для удаления Uncategorized. Эта категория отображается во фронт-энде только если в ней есть товар или запись и т.д.

Худший ответ:
Если страница категорий выведена через шорткод, попробуйте такой вариант  [product_categories hide_empty="true"] где hide_empty="true" как раз отвечает за скрытие пустых категорий и если Uncategorized будет пустая, то она не будет выводиться. Если через виджет категорий, то там есть чекбокс - скрыть пустые  категории. На последней версии woocommerce не тестировал, а на версии 3.2.6 такой вариант работает.
Вопрос: Как настроить подключение к интернету через модем который подключен к RPI, а сама подключена к роутеру?

Лучший ответ:
настроить проброс портов на RPI, поставить прокси, IP tables, куча вариантов. Какая ОС на Rasbery?
И вообще зачем модем в RPI, почему не воткнуть  RPI в роутер, и модем туда-же, и не настроить всё по нормальной схеме?

Худший ответ:
Поставьте на RPI openwrt например. и сможете использовать как роутер. и все будет проще намного.
Вопрос: Можно ли проносить ноутбук через рентгеновский аппарат в аэропорте, не навредит ли?

Лучший ответ:
Не повредится, как показывает практика командировок.

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

Лучший ответ:
Примерно так: https://ideone.com/kylhD6
Конечно, надо немного доработать, чтобы определяло именно слова, а не совпадения по буквам. То есть сейчас он в Ленинград и "Ленинградский" запихнет. upd:
https://ideone.com/aBSGzA
Допилил так, чтобы искал именно слова, а не просто вхождения строки.
Если нужно искать именно слова, то можно допилить так:strpos(" ".$phrase." ", " ".$word." ") !== false
Исходный код:spoiler<?php
$arr = [
'Концерт группы Ленинград',
'Группа ZebraHead',
'ZebraHead',
'Группа СПЛИН',
'Ленинград',
'Концерт группы ZebraHead',
'ZebraHead. Презентация альбома',
'СПЛИН в Олимпийском',
'Крематорий',
'Группировка Ленинград'
];
$newarr = [];
 
$words = [];
$result = [];
 
foreach($arr as $key => $val){
    //приводим к нижнему регистру
    $val = strtolower($val);
 
    //убираем знаки препинания и прочие символы
    $val = str_replace(".", "", $val);
    $val = str_replace(",", "", $val);
    $val = str_replace("/", "", $val);
    $val = str_replace(";", "", $val);
    $val = trim($val);
 
    //запоминаем "очищенные" слова
    $newarr[$key] = $val;
 
    //разделяем слова в массив
    $cw = explode(" ", $val);
 
    //запоминаем весь список слов
    foreach($cw as $word){
    	array_push($words, $word);
    }
}
 
 
foreach($words as $word){
	$ca = [];
 
	foreach($newarr as $key => $phrase){
		//проверяем, что фраза содержит это слово
		if(strpos($phrase, $word) !== false){
			//если так, то запоминаем
			array_push($ca, $arr[$key]);
		}
	}
 
	$result[$word] = $ca;
}
 
print_r($result);

Худший ответ:
Без ошибок и без словаря, в котором будут выставлены веса для отдельных слов - никак.
Поясню. У вас стоит задача разбить строки с упором на музыкальные группы (отталкиваюсь от вашего примера), значит для всех названий групп должен стоять приоритет группировки, иначе объединение будет происходить случайным образом - по первым попавшимся словам.
Вопрос: Как сделать разлет картинок из центра по краям после задержки?

Лучший ответ:
Здравствуйте.
Если вы хорошо владеете javascript, то предлагаю воспользоваться "Зелёным Шоком"
Этот фреймворк делает различные сложные анимации, может пригодится во многих интересных и сложных проектах, на ютубе есть много видео о нём, хоть и на английском, но у них полно примеров на codepen, так что - Welcome )))
https://greensock.com

Худший ответ:
Jquery есть anim метод
Вопрос: В чём необходимость веб-фреймворков для заказчика?

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

Худший ответ:
Всё очень просто - деньги. Дешевле взять что-то готовое и популярное, чем оплачивать время на создание "с нуля"