Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Как напечатать текстовый файл в нужной кодировке в CMD?

Лучший ответ:
Сменить кодировку в консоли:
chcp <номер кодировки>
По умолчанию в консоли 866 кодировка. Команда type никаких преобразований не делает (за исключением случая, когда файл в UTF с BOM, тогда она преобразует UTF в кодировку консоли).

Худший ответ:
Сохраняйте сразу файл в нужной кодировке.
Вопрос: Сканировал IP в своем городе и наткнулся на интересный сервер FTP с явным нарушением законов. Может куда то передать?

Лучший ответ:
Не надо никуда ничего передавать. Можешь испортить человеку жизнь. Тебе это надо?
Лучше на сервере размести, чтобы владелец правильные права выставил.

Худший ответ:
Главное - не забыть сказать в заявлении, что на сервер наткнулся сканированием сети, чтобы и самого привлекли за несанкционированный доступ. Так будет правильней.
Вопрос: Вопрос по View (PHP MVC)?

Лучший ответ:
В Yii есть такое понятие как layout. Он представляет собой макет используемый в большинстве страниц сайта. Внутрь него вставляются файлы с отличиями (собственно, это и есть view). Таким образом макет верстается один раз, а отличия, характерные для каждой страницы помещаются в отдельные файлы. Если, например, речь идет о форме, то можно написать 2 таких файлы — с разметкой формы и с результатами ее обработки. Каким образом генерируются эти файлы — с шаблонизаторами или без не имеет значения.

Худший ответ:
Можно так же использовать наследование шаблонов, как в Twig.
Вопрос: Что пишется в файле hostname?

Лучший ответ:
Every GNU/Linux system has a hostname, whether you like it or not. A system's hostname usually has a corresponding entry in the domain name system (DNS), but it doesn't necessarily have to. The hostname is the name that programs such as mail and web servers use to identify the system that they are running on. Many of these programs will issue warnings, or in some cases completely fail to run if the hostname is not set correctly.
По сути это имя компьютера в сети.

Худший ответ:
имя хоста то есть имя пк на котором установлена система
Вопрос: Скрипт поиска по html странице?

Лучший ответ:
Код в исходниках.Вот
ЗЫ: я нашел в гугле. А вы искали?

Худший ответ:
1. new RegExp по введенному слову для поиска
2. .replace(reg_exp/gi, '<span class="red">' + search_field + '</span>')
Примерно так...
Вопрос: Какой ВУЗ выбрать, если не ВМК МГУ, имея льготу по инвалидности?

Лучший ответ:
Идите в колледж. Вы уверены, что ваша инвалидность не скажется на усвоении знаний? Ракеты собрались делать или просто проскочить по инвалидности? При устройстве на работу тоже будете инвалидностью светить? Поймите, капитализм не гарантирует вам космических успехов в жизни, он просто перестраивает препятствия. Программирование это как прыжки с парашютом, тем более вы говорите, что я не сдам (больше двух заданий решить не смогу).

Худший ответ:
Вы действительно не сможете решить от туда больше пары заданий? Какой вам МГУ тогда! Не занимайте чужие бюджетные места, может из-за вас умный человек пролетит. 
Правильно lookid говорит, вам лучше в колледж.
Вопрос: Как сделать миксин для jade для меню с подпунктами?

Лучший ответ:
На самом деле не сильно удобно из за того, что массив нужно выстроить в одну строку. Может кто еще подскажет решение.- var newsList = [{name : 'Пункт 1', sub: ['Пункт 1.1', 'Пункт 1.2', 'Пункт 1.3', 'Пункт 1.4']}, {name : 'Пункт 2', sub: ['Пункт 2.1', 'Пункт 2.2', 'Пункт 2.3', 'Пункт 2.4']}]each item in newsList
            li            
                a #{item.name}
                each subitem in item.sub
                    ul
                        li
                            a #{subitem}
Продолжил копаться и с миксинами получается красивее:- var newsList = [{name : 'Пункт 1', sub: ['Пункт 1.1', 'Пункт 1.2', 'Пункт 1.3', 'Пункт 1.4']}] 
- var newsList2 = [{name : 'Пункт 2', sub: ['Пункт 2.1', 'Пункт 2.2', 'Пункт 2.3', 'Пункт 2.4']}]mixin list(items)
            ul
                each item in items
                    li
                        a #{item.name}
                        each subitem in item.sub
                        ul
                            li
                                a #{subitem}
И вызываем миксины:+list(newsList)
+list(newsList2)
Но наверное можно как то еще более красиво сделать
------------
Добавил: - var menu = [item1, item2]
иeach item in menu
        +list(item)
Надеюсь кому то будет полезно

Худший ответ:
Массив не обязательно выстраивать в 1 строку- 
 var newsList = [
 {name : 'Пункт 1', sub: ['Пункт 1.1', 'Пункт 1.2', 'Пункт 1.3', 'Пункт 1.4']}, 
 {name : 'Пункт 2', sub: ['Пункт 2.1', 'Пункт 2.2', 'Пункт 2.3', 'Пункт 2.4']}]
или так- var newsList = [
- {name : 'Пункт 1', sub: ['Пункт 1.1', 'Пункт 1.2', 'Пункт 1.3', 'Пункт 1.4']}, 
- {name : 'Пункт 2', sub: ['Пункт 2.1', 'Пункт 2.2', 'Пункт 2.3', 'Пункт 2.4']}]
В итоге первый вариант корочеeach item in newsList
            li            
                a #{item.name}
                each subitem in item.sub
                    ul
                        li
                            a #{subitem}
Вопрос: PHP, ООП. Практическое изучение

Лучший ответ:
Любую задачу (решаемую в принципе) можно реализовать как с ООП, так и без него (в процедурном стиле, например). «Прелести» ООП лучше всего чувствуются на больших проектах, где невозможно держать в голове все (глобальные) переменные и функции и способы их взаимодействия и приходишь к пониманию необходимости использовать более высокие уровни абстракции, чем отдельные значения и классические массивы из них. Начинаешь объединять семантически связанные данные в структуры (ассоциативные массивы в PHP), а функциям с ними работающим давать имена с префиксом (обычно) в виде названия (чисто семантическое) этих структур, чтобы хоть немного упорядочить глобальное пространство имён, получая функции вида user_login(array $user, $login, $password), user_logout(array $user) и user_is_logged(array $user). До простейшего ООП осталось сделать один шаг — перенести и функции (указатели на них в С, callback/имена в PHP) в эти структуры, но синтаксис вида call_user_func($user['user_login'], $user, $login, $password) мягко говоря неудобен и избыточен и тут в PHP4 вводят вместо него синтаксис $user->login($login, $password) и без него ты больше не можешь жить :)

Если же до семантических концепций ООП не дойти на своей шкуре, то разницы между user_login(array $user, $login, $password) и $user->login($login, $password) почти нет, но даже на таком простом примере видно, что запись банально короче и глобальное пространство имён меньше используется, что особенно заметно при использовании IDE с автодополнением.

Но это философское отступление было о некоторых прелестях ООП. Прямой ответ на вопрос «какую задачу?» — любую интересную хотя бы чуть-чуть. Желательно с развитой предметной областью, в которой ощущается интуитивно наличие нескольких абстракций разного уровня. Если для процедурного приложения вы создаёте несколько таблиц в БД или используете ассоциативные массивы для группировки семантически близких значений — то это, скорее всего, такая задача. Для большего wow-эффекта или просветления можно попробовать написать две версии одного приложения типа блога, одну в процедурном стиле, другую в ООП. Причём в первой желательно не использовать «промежуточные» решения типа ассоциативных массивов даже для mysql_fetch_assoc/array(), только бескомпромиссное mysql_fetch_row(). Если же без ассоциативных массивов вы уже разработки не представляете, то вы уже почти достигли ОО-просветления :)

Худший ответ:
Напишите как утром просыпаетесь и чистите зубы. ООП - это моделирование мира, только не в реальном пространстве, а внутри компьютера.
Вопрос: Чьи портреты должны висеть в кабинете информатики?

Лучший ответ:
Первыми в голову пришли Алан Тьюринг и Джон фон Нейман почему-то. Я сразу подумал, что они очень круты, еще когда первый раз услышал.
Джобс — ИМХО, в школьном кабинете информатики — не очень в тему. Но с другой стороны, детям скорее всего не очень интересно будет знать что за «старперы» повсюду висят — а Джобс это прикольно, его фотку все видели как минимум 1 раз.

Поэтому из современников можно Джобса, Гейтса, Торвальдса, еще кого-нибудь кто более менее на слуху. Кого-то из основателей Гугола, например Сергея Брина, он более засвечен. Столлмана еще можно, как бы к нему ни относились, но он достаточно мощный. Ну в тоесть, разбавить как-то, из разных партий и времен людей повесить, не только хардкорных математиков-физиков и не только товарищей из списка Forbes.

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

Лучший ответ:
Лучше всего начать с изучения ЯП.

Худший ответ:
Скрипач не нужен, дорогой!
Лучше допилите mplayer до нужного состояния и сделайте мир лучше. Начинать - с ЯП, все верно говорят. Потом - знакомство с конкретным проектом, с его багтрекером.
Вопрос: Почему не платят за уязвимости, что я делаю не так?

Лучший ответ:
После найденной серьезной уязвимости почти всегда пишу админам/владельцам и т.д, чаще стараюсь выходить на прямой контакт сразу чтобы общаться с ответственным, в итоге только 1 из примерно 70 компаний платит "спасибо" хоть что-то.
ИМХО здесь дело в умении вести переговоры с владельцем бизнеса. У Вас получается найти уязвимость, но не получается донести до владельца ценность Вашей находки. Нет предела совершенствованию, есть куда расти...

Худший ответ:
Стать blackhat? Ну или сначала договариваться, а потом искать уязвимости? Или искать уязвимости там где за них платят?
Вопрос: Какие сервисы/cофт помогают в работе фралинсера?

Лучший ответ:
Для моей работы помогают вот эти ссылки.

Худший ответ:
lancemonitor.com собирает и присылает на почту проекты с различных фриланс-бирж(русских и иностранных) по заданным ключевикам
toggl.com для учета отработанного времени
Вопрос: IDE для разработки под микроконтроллеры?

Лучший ответ:
Выбор целиком и полностью зависит от того, с какими контроллерами предстоит работать.
К примеру, у Texas instruments есть CodeComposer - жуткая (во всяком случае, в старых версиях) штука, которая ещё и стоит немалых денег.
У Atmel есть AtmelStudio - для архитектур AVR и ARM. Как легко догадаться, заточена под контроллеры самого Atmel. Среда хорошая и бесплатная, хотя довольно задумчивая и тяжеловесная.
Под архитектуру ARM есть Keil - потрясающая штука с кучей возможностей и удобным интерфейсом. Что особенно приятно, для проектов меньше 32 Кб использовать её можно совершенно бесплатно. Я бы рекомендовал именно её.
Для семейства Cortex есть ещё бесплатный CooCox - тоже весьма славная и относительно лёгкая штука.
А если работать предстоит с STM32, то нельзя не упомянуть о шикарном инструменте CubeMX - это не среда разработки, а генератор кода инициализации. Существенно упрощает жизнь.

Худший ответ:
Keil для C167 вполне годная среда.
Вопрос: Как устроен сервис коротких ссылок?

Лучший ответ:
Это идентификатор (число) закодированное в base62.
Полученную строку можно раскодировать.

Худший ответ:
CRC32 
но url все равно придется хранить, т.к. обратно не получится.
base62, короткая ссылка будет в 1.5 раза больше чем начальная
Вопрос: Пользователи KeePass, в каком поле вы храните email? И что храните в названии?

Лучший ответ:
Если эл.почта является логином для входа, то в поле логина) Если нет, то в примечаниях оставляю.

Худший ответ:
Кэп подсказывает, что в имени хранится имя, а в пароле — пароль. :)
Если имя — это почта, то в имени хранится почта.
Если имя — не почта, но зачем Вам вообще почта в записи? Единственное, для чего она нужна — это для восстановления пароля. А если у Вас есть Keepass, то зачем Вам восстанавливать пароль?

В названии храню «Вася на habrahabr.ru» — легко будет находится через поиск, что по домену, что по имени. От просто «haabrahabr.ru» или «аккаунт на хабре» ушел, поскольку при нескольких аккаунтах на одном сервисе не поймешь что где.
Вопрос: Нужна помощь в Разборке кода как уменьшить вращения Сервопривода?

Лучший ответ:
что такое "уменьшить вращения "?

Худший ответ:
Что надо-то? Уменьшить скорость перехода сервы из одного положения в другое? Изменить скорость сервы, которая рассчитана на постоянное вращение?
Можно не вникая в программу сделать из myservo.write(i); сделать myservo.write(i/2);
В случае с сервой постоянного вращения, это уменьшит её скорость, в данном случае в 2 раза, в случае с обычной сервой уменьшит угол её поворота в 2 раза.
Если надо замедлить движение и сделать его более плавным, то судя по всему уменьшение переменной аa=15;
else
a=-15;
в, допустимa=5;
else
a=-5;
приведет к данному результату. Причем a=1 даст наиболее плавный переход.
Вопрос: Самый быстрый алгоритм определения страны по номеру телефона

Лучший ответ:
Что может быть быстрее функции, вычленяющей код страны из номер телефона, и поиска страны по хеш-таблице «код» -> «страна»? Хеш-таблицы в большинстве языков реализованы адекватно, скорость выборки будет очень высокой.

Худший ответ:
Очевидно, только по таблице префиксов. БД с кодами стран в инете куча.
Вопрос: Можно ли отдельно написать программную часть на java и отдельно «верстку» на Android?

Лучший ответ:
Можно слушать кучу советов, как удобнее превратить явовский фреймворк в функциональное программирование под виндовс, но лучше этого не делать.
Ваши рассуждения очень правильны и верны: бизнеслогика любого приложения должна быть отделена от дизайна. Тогда любое изменение в дизайне не приведет к изменениям в бизнеслогике. Тем более в Java это делается не просто, а очень просто.
Создаете классы с бинеслогикой, можете как опцию добавлять тестюниты для проверки нормального функционирования этой логики. Отладку можно вести даже в консоли. После этого можете к созданным объектам цеплять любые графические изыскания.

Худший ответ:
На Android отлично ложится MVP. Разделите все на отображения (showProgress, showContent и т.д.), представления(связь с интерфейсом, бизнес логика) и модели.
Отображение опишите в виде интерфейса, который потом подключите к реальному интерфейсу, а представления и модель можете описать и тестировать без интерфейса.
antonioleiva.com/mvp-android
Вопрос: Форма отправки данных, В чем проблема?

Лучший ответ:
Аналогичный случай был в Одессе

Худший ответ:
Спасибо. Проблема была в базовый javascript... он не смог получить данных =)
Вопрос: Как посмотреть количество подписчиков у бота в Телеграме?

Лучший ответ:
Лично я просто записываю в файл историю команд от каждого пользователя. Решение "в лоб" конечно же.
Хотя смотря на статистику использования стикеров, логично предположить наличие такой же для ботов, но похоже, что такой нет.

Худший ответ:
можно воспользоваться сервисом botanio
https://www.npmjs.com/package/telegraf-botanio
вот еще описание для бота на питоне
https://groosha.gitbooks.io/telegram-bot-lessons/c...
Вопрос: Нужно ли оптимизировать переменные в JAVA, и когда?

Лучший ответ:
Хотел сначала написать это как комментарий к предыдущему ответу, но решил, что этот ответ все-таки не до конца верен. Тут человек спрашивает скорее "зачем нужны типы byte и short, если есть int", а не "когда нужно оптимизировать". На вопрос "когда нужно оптимизировать" ответ, безусловно, правильный.
Типы с разрядностью, меньшей чем у int, нужно использовать только с точки зрения экономии памяти, например, в больших массивах или классах с большим количеством полей. Использовать их в качестве локальных переменных не имеет смысла, т.к. процессор в любом случае оперирует типами размером с машинное слово (а Java на 16-битных машинах не работает, так ведь?). Т.е. об оптимизации вообще речи не идет, разницы нет, и в качестве локальных переменных типы byte и short, в принципе, появляться не должны. А вот если у тебя массив из over9000 элементов, в качестве элементов которого пойдет и short, то int использовать не стоит.

Худший ответ:
Оптимизировать что угодно где угодно нужно после того, как профайлер покажет узкое место.
Хороший профайлер для Java называется YourKit и выдается на 30 дней бесплатно.
Если каждый раз регистрировать новый email, эти 30 дней превращаются в вечность - рекомендую!
Вопрос: Кто знает хорошие видеоуроки по php?

Лучший ответ:
Я недавно начал курс на хекслете https://ru.hexlet.io/courses/php5. Особенность этого курса, в том что он учит больше тому как программировать чем просто синтаксису. Курс еще не завершен, но уже кое что сделано и работает. Ну и так как это хекслет, то там же в курсе есть практика в браузере.

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

Лучший ответ:
Для разбиения на две группы задача сводится к задаче о рюкзаке с весом рюкзака равным половине общего веса камней и ценностью камней равной их весу.

Худший ответ:
В итоге я сделал полный перебор с исключением заведомо неоптимальных решений. Судя по википедии, это "Метод ветвей и границ". По моим наблюдениям, в зависимости от исходных данных, обсчёт набора из 25 чисел может занять от всего ~20 и вплоть до 3.5М циклов. На Python 2.7:# -*- coding: utf-8 -*-

from random import randint
from itertools import combinations

#data = [53, 50, 74, 4, 11, 68, 65, 50, 25, 84, 65, 63, 14, 54, 49, 17, 65, 48, 74, 66]
data = [randint(1,100) for i in xrange(25)]
#data = [990,1,2,3,1000]

data.sort(reverse=True)
limit = float(sum(data))/2
# Pre-calculate min and max possible number of elements in a group
bounds = [0, 0]
for i in (0,1):
    maxsum = 0
    for n, item in enumerate(data[::(1,-1)[i]], 1):
        cursum = maxsum + item
        if cursum <= limit:
            maxsum = cursum
        else:
            bounds[i] = n - int(n > 1)
            break
nmin, nmax = bounds
# Main calculations
maxsum, cycles = 0, 0
for n in xrange(nmin, nmax+1):
    # The following check could be efficient with integer numbers, not float
    if maxsum == limit:
        # One of exact solutions has been found
        break
    else:
        # Iterate through all possible combinations:
        # combinations('ABCD', 2) --> AB AC AD BC BD CD
        for vector in combinations(data, n):
            cycles += 1
            cursum = sum(vector)
            if maxsum < cursum <= limit:
                maxsum = cursum
                solution = vector
                # The following check could be efficient with integer numbers, not float
                if maxsum == limit:
                    # One of exact solutions has been found
                    break
            elif cursum <= maxsum:
                # No reason to continue because data is sorted in descending order 
                # and all of the following sums in this loop will be even smaller
                break
# Print result
print 'data =', data
print 'nmin =', nmin
print 'nmax =', nmax
print 'solution =', solution
print 'cycles =', cycles
print 'limit =', limit
print 'sum =', maxsum
Вопрос: Как сменить экран загрузки Ubuntu 14.04?

Лучший ответ:
тут что-то есть по этому поводу:
https://habrahabr.ru/sandbox/47221/
Window.SetBackgroundTopColor в скрипте темы

Худший ответ:
тут что-то есть по этому поводу:
https://habrahabr.ru/sandbox/47221/
Window.SetBackgroundTopColor в скрипте темы
Вопрос: Как можно вычислить злоумышленника, имея на руках логи яндекса и логи биткоин-биржи?

Лучший ответ:
Забудьте.

Худший ответ:
Это даже не WebMoney, он украл биткоины. Даже если очень захотеть, у вас ничего не получится.
Даже если вы его чудом найдёте, деньги вы вряд ли сможете вернуть и доказать то, что он их украл.
Вопрос: Как спрятать страну от гуглокарт на другом сайте?

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

Худший ответ:
З всеми этими сложными маскировками мы обычно забываем про такую простяцкую вещь как useragent - а в первую очередь смотрят на него! А там много можно чего полезного извлечь - не только язык, но и платформу и разрядность и еще всякого прочего. Поставьте в FF расширение useragent switcher.
Вопрос: Каким образом можно научиться правильно создавать тени?

Лучший ответ:
вангую ядерный взрыв слева за кадром

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

Лучший ответ:
Ошибка №1
Причина:
Дважды (или более) объявляется функция
Решение:if (!function_exists('get_date_time')) {
    function get_date_time($timestamp = 0) {
      if ($timestamp)
        return date("Y-m-d H:i:s", $timestamp);
      else
        return date("Y-m-d H:i:s");
    }
}
Ошибка №2
Причина:
    php.ini
Решение:
php.net/manual/en/function.curl-setopt.php#95027

Худший ответ:
Fatal error: Cannot redeclare get_date_time() (previously declared in
Потому что в скрипте надо не объявлять функцию а только вызвать её:$a = get_date_time($b)
Результат её работы будет в переменной $a а передадите в неё для работы переменную $b
Вопрос: Книги на теорию

Лучший ответ:
Официальные цисковские руководства к CCNA

Худший ответ:
Может это не совсем то, что нужно, да еще и на английском, но лучше я ничего не видел — amzn.to/X1tkH4.
Вопрос: Как реализовать мультиязычный интерфейс с помощью Django?

Лучший ответ:
Ну есть же встроенные иструменты для локализации. Документацию почитай. И поставь PyCharm, на сублиме тяжко с джангой работать.
P.S. Реклама на казахский переводится, как "жарнама".

Худший ответ:
тут все очень доходчиво:
www.marinamele.com/taskbuster-django-tutorial/inte...
Вопрос: MSDN AA больше нет?

Лучший ответ:
спросите у сотрудников Microsoft, например habrahabr.ru/users/kichik/

Худший ответ:
Ну сервер точно доступен по обычному DreamSpark … с клиентскими — не знаю.
Вопрос: Почему не работают функции jQuery для подгружаемого контента?

Лучший ответ:
$('.delShelving').on('click', function() {
// меняем на 
$(document).on('click', '.delShelving', function() {
и пробуем. Должно теперь заработать.
А дальше идём в гугл, оттуда попадаем на сайт jQuery на странику метода .on() и читаем что такое Direct and delegated events и как они баблятся (bubble) наверх по DOM дереву.

Худший ответ:
Почитайте про прямую и делегированную обработку, используйте$('parent').on('click', 'child', function(){ //... });
// parent — ближайший родитель, который не добавляется динамически
// child — Ваш элемент, на который Вы навешиваете событие click, т. е. '.delShelving'
Вопрос: домены-алиасы социальных сетей

Лучший ответ:
на работе работать надо а не «палиться» сидеть.
а регистрировать домены, что бы тут же их закрывали, смысла не имеет.

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

Лучший ответ:
Вы серьёзно?
Прошу прощения, но зачем для церкви сайт? Крестим детей не выходя из дома? Поставьте свечку за благополучие?

Худший ответ:
На гудфоне можно найти очень много изображении в большом разрешении. Вот например:
www.goodfon.ru/search.php?q=%D1%86%D0%B5%D1%80%D0%...
www.goodfon.ru/search.php?q=%D1%80%D0%B5%D0%BB%D0%...
Вопрос: Какой уровень знания математики нужен фронт-энд программисту?

Лучший ответ:
Можно спокойно начинать без математики вовсе.

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

Лучший ответ:
Лично я знаю один пример когда экономист-математик переквалифицировался в .NET разработчика. У парня всё получилось, колбасил на Delphi, потом C#/WPF, сейчас c#/ASP.NET. 
Дерзайте.

Худший ответ:
Насчёт перспектив - перспективно и даже очень (+ смотря какое направление).
А про вопрос "стоит ли" - попробуй сам.
Я съел собаку на таких вопросах на разных форума и тостере, в итоге сел за книгу в перерыве между вопросами и как то затянуло.