Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Git — одна проблемка

Лучший ответ:
Судя по тому, что написано вверху — центральный репозитарий у вас bare, то есть репозитарий хранящий данные о коммитах, но не хранит какую-либо версию рабочего дерева в явном виде (на самом деле хранит, но немного своеобразно, как именно читайте тут habrahabr.ru/post/143079/). Когда вы делаете push в такой репозитарий, то git раскидывает данные всех коммитов по этому репозитарию.

Кроме bare-репозитоия вы можете делать push и в обычный репозиторий. Сделайте clone в другую папку и попробуйте из своего локального сделать push туда (для этого добавьте еще один удаленный репозитарий, где адрес — папка .git в новой, только что склонированной копии), только в этом случае вы не сразу получите измененные файлы (данные о них уже есть в этой копии репозитария, но их надо оттуда «наложить» — сделать pull в этом репозитарии).

Теперь про заказчика. При разработке, несмотря на то что git — распределенная система, есть центральный репозиторий, в котором хранится большинство веток и изменений. Когда заказчик говорит «ДАЙ», человек, отвечающий за выпуск, забирает себе данные определенного коммита (на основе которого строится новая версия) и формирует инсталятор/пакет/что-то еще.

И еще про вопрос на тему «а как получить не bare». Когда нажимаете «Create new repository here» появляется окно, в котором надо убрать галочку «Create bare repository». В этом случае у вас в папке появится только скрытая папка .git. Ну и все — это будет новый репозиторий в котором можено создавать и править файлы, коммитить и прочее.

PS. Еще я понял, что вы до этого работали с Subversion. Сам я так же пришел к git. Сначала будет трудно и непонятно, но оно, на мой взгляд, того стоит.

Худший ответ:
anarsoul, делать push не в bare-репозиторий чревато проблемами, особенно, если с ним кто-то работает напрямую.
представь ситуацию, когда ты работаешь над функцией, а твой коллега push'ит в ту же ветку в ту же функцию и удаляет строчки, на которых основываются твои текущие наработки.
третий bare-репозитарий должен быть и являться накопительным — это общепризнанная схема работы.
а в него можно навешать хуков, чтобы делать с working tree что угодно
Вопрос: Популярен ли node.js?

Лучший ответ:
Достаточно популярен и перспективен. Node.js занял свою нишу и падение спроса на него не должно случится в ближайшее время. 
О популярности можно, например, судить по растущему количеству модулей в npm.

Худший ответ:
Довольно стабильно вижу вакансии со знанием node.js.
Вопрос: Как заблокировать сайт штатными средствами ubuntu?

Лучший ответ:
Чтобы не "тупили", замените "-j DROP" на "-p tcp -j REJECT --reject-with tcp-reset" или на "-j REJECT --reject-with icmp-net-prohibited".

Худший ответ:
1) поменять правила ACCEPT и DROP местами
2) используй ipset, адреса в который можно добавлять резолвингом по крону или узнаешь с какого-нибудь bgp-резолвера.
А виджеты на сайтах висят скорее всего из-за не всех фильтруемых IP-шников. Узнай все его адреса и отфильтруй их.
Но все же прокси для этого подходит лучше.
Вопрос: Есть ли какой редактор с подсветкой кода в веб-браузере?

Лучший ответ:
В любом случае, есть смысл познакомиться со следующими:
ace.c9.io
codemirror.net

Худший ответ:
Этот подойдет?ГлавнаяПримеры
Смотрится прилично.
Вопрос: Сравнение строк на C#?

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

Худший ответ:
Стандартного решения нет. Либо пишите метод для сравнения строк либо наследуйтесь от класса String и перекройте метод Equals
Вопрос: Поисковики проиндексировали ссылку с портом — www.site.ru:8808/link. Как лучше запретить индексировать порт?

Лучший ответ:
раз проиндексировали — значит как то про них узнали, устраните причину, и поставьте постоянный редирект на сайт на наормальном порту…

Худший ответ:
лучше сделать правило, которое с этого порта делает нормальный редирект с кодом 301, его поисковики понимают и корректно отрабатывают.
Вопрос: Как проверить наличие объекта в массиве?

Лучший ответ:
Можно проверить по совпадению значений свойств:var productBox = [{product: "Рыба", count: 10}];

function addTo(product, count){
   var cond = productBox.some(function(e){ 
        return e.product == product;
   });

   if(cond){
      alert("Такой продукт уже есть");
      //Но лучше просто увеличивать count у продукта
   }else{
      productBox.push({product:product, count:count});
   }
}

addTo("Водка", 5);
addTo("Мясо", 3);
addTo("Шампур", 10);
addTo("Водка", 22);

Худший ответ:
Для сравнения объектов в JS нет спец функций.
Можно использовать что-нибудь типа: 
https://github.com/rikkimongoose/JSonCmp/
Если точно знаете положение объекта в массиве - сравниваете только его, если нет - то по всему массиву выуживаете объекты и их сравниваете с входящим.
Вопрос: Удалённая работа в США/Канаде?

Лучший ответ:
Работаю удаленно на сша.
1) Пишу кому нужно вопрос и если ответа нет минут 20-30, это значит что все спят, я беру другую задачу. Когда ответят - продолжаю.
2) От 15 до 60$ в час, налоги не плачу никакие.
3) Отпусков нет и это прекрасно. Система отдыха там гораздо логичней, ты просто говоришь "через 2 недели мне нужно будет свалить на несколько дней." Естественно тебе эти несколько дней не оплачивают. 
Работаешь - платят, не работаешь - не платят, не работаешь слишком часто - идешь лесом.

Худший ответ:
Обычно это означает, что работать придется по ночам, если нужно плотное взаимодействие. По крайней мере вам придется несколько часов быть на связи поздним вечером/ранним утром. 
С отпусками действительно плохо, ориентируйтесь на короткие перерывы (до недели) за свой счет.
Вопрос: Разделители между (возможно скрытими) span'ами

Лучший ответ:
Решение, как обычно, нашлось там, где его никто не ждал. Надо использовать так называемый general sibling selector:

.item.active ~ .item.active:before {
    content: ', ';
}

В таком случае запятая вставляется только перед теми видимыми пунктами перечисления, до которых у того же родителя встречается другой видимый пункт.

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

Лучший ответ:
В Google Chrome: F12 -> Network, там будут все запросы и ответы сервера.

Худший ответ:
Запомнить, какие запросы были отправлены, и проверять:var requests = [];
requests.push($.ajax({type: 'GET', url: '/echo/json/'}));
requests.push($.ajax({type: 'GET', url: '/echo/json/'}));
requests.push($.ajax({type: 'GET', url: '/echo/json/'}));
requests.push($.ajax({type: 'GET', url: '/echo/json/'}));
requests.push($.ajax({type: 'GET', url: '/echo/json/'}));

console.log(requests);

function Test(){
    $.each(requests, function(i, req){
        if(req.readyState == 0 || req.readyState == 4){
            console.log(req.status + ': ' + req.statusText);        
        }else{
            console.log(req.readyState);        
        }
    });
}

Test();

window.setTimeout(Test, 3000);Посмотреть пример.
Можно удалять запросы из коллекции по завершению их выполнения.
Вопрос: Реальна ли кроссплатформенная разработка силами одного человека под iOs и Android?

Лучший ответ:
Может вам нанять хорошего Javascript разработчика и посадить его на Phonegap? Сказал бы более реальный вариант… Но он ничего хорошего не принесёт.
Как разработчик под Android скажу так: этому «универсальному человеку» будет очень не легко. Лучше наймите двух разработчиков под натив. Иначе получится бред. У Android и iOS есть свои мелкие забумбоны, и то как программы себя ведут, как выглядит графика, итд… Одному человеку на универсальной платформе такую работу сделать хорошо не под силу, так как либо он не знает как её сделать хорошо, либо он ни разу не разрабатывал прогармму для обеих платформ. И в конце концов получится iPhone программа мигрированная под Android либо карявая программа на iPhone.

Худший ответ:
смотря что делать. с небольшими прогами это возможно
Вопрос: Чем можно заменить CD-привод в ноуте?

Лучший ответ:
Я в ноуте заменил HDD на SSD. А старый HDD поставил вместо DVD, использовав вот такую штуку: www.ulmart.ru/goods/288056/

Худший ответ:
Однозначно SSD, 3G и GPS.
Вопрос: Как реализовать всплывающее окно в Rails?

Лучший ответ:
Причем тут rails?
Вам нужно почитать про js+css и взять любой плагин модальных окон. Тот же Lightbox для картинкок. Или как тут https://www.youtube.com/watch?v=5huBlLhywJg

Худший ответ:
Самый простой путь: подключаете модуль для окон, либо bootstrap сразу. Прописываете необходимые пути в asssets для js и css. После чего просто вызываете и создаёте их. Это второй глупый вопрос от вас. Рекомендую для начала внимательно прочитать гайды по рельсам, чтобы не путать тёплое с мягким. Рельсы это фрэймворк для бэк-энда, ему глубоко и сильно фиолетово, что и как у вас на фронтэнде, пока вы используете допустимый для него стек технологий. По умолчанию на фронт у него доступны HTML, CSS, SCSS, JS, CoffeeScript.
UPD: у вас есть layout-ы: application и  иные, которые вы сделаете сами. Для них есть имя_лэйаута.css и имя_лэйаута.js. В них вы должны подключать плагины. Плагины должны быть в соответственных assets(stylesheets or javascripts or images). Для некоторых вещей есть сразу собранные гемы, которы подключать ещё проще. Для bootstrap точно есть. 
Плагины лучше всего размещать в отдельных папках и для них дописывать строку: *= require_tree ./путь_к_директории_плагина в css
//= require_tree ./путь_к_директории_плагина в js.
Вопрос: Какие должны быть размеры 3D моделей в Unity3d?

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

Худший ответ:
Установка камеры никак не повлияет на размеры (поцики, шухер, он камеру поставил, быстро все уменьшились!). Размер вообще вещь относительная, может, вы зазумились очень сильно:) Сравнить можно с дефолтным кубом. Ну а при импорте придется выставлять какой-то коэффициент.
Вопрос: О чём это может свидетельствовать (мини вопрос)?

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

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

Лучший ответ:
Добрый день.
У меня есть ощущение, что такой книги нет. Большинство книг начинается с изучения базовых вещей, а их проще рассматривать в консольных приложениях, а разработка пользовательских интерфейсов - это уже WinApp, WPF или Store приложения. Да и многие темы рассматривать в рамках всего одного приложения или не получится, или получится нечто притянутое за уши... Придумайте себе большую задачу, начните читать хорошую книгу по C#, а по мере изучения разных частей пытайтесь изучаемое применить к своему приложению. Прочитав книгу выкиньте все что вы делали до этого и попробуйте теперь все сделать с нуля...

Худший ответ:
Для веба есть хорошие книги:
www.amazon.com/ASP-NET-MVC-1-0-Website-Programming...
www.amazon.com/ASP-NET-MVC-Test-Driven-Development...
Вопрос: Как сделать такой эффект ховера?

Лучший ответ:
.menu-item {
  position: relative;
  display: inline-block;
  overflow: hidden;
}
.menu-item:before {
  transition: .5s all;
  display: block;
  content: "";
  width: 100%;
  height: 2px;
  background-color: black;
  position: absolute;
  top: 50%;
  left: -100%;
  z-index: 10;
}
.menu-item:hover:before {
  left: 100%;
}
https://codepen.io/anon/pen/WjLbyG
***
PS: В оригинальном сайте все вычисляется по JS

Худший ответ:
В общем сделал сам, не идаельно но меня утсраивает. Может кому понадобиться.main-menu
    &__link 
       position relative
       overflow hidden
       +before('')
          display block
          width 100%
          height 4px
          background-color $yellow
          position absolute
          top 50%
          transform translateX(-116%)
          z-index 1
      
.is-active
   +before()
      transform translateX(116%)
      transition ease-in-out .6s(function() {

    var link = $('.main-menu__link');

    if(!link.hasClass('is-active')) {
        link.mouseover(function(event) {
            $(this).addClass('is-active')
        })
        link.mouseleave(function(event) {
            var self = $(this);
            setTimeout(function(){
                self.removeClass('is-active')
            },300);
        });
    }

})();
Вопрос: Какие-то проблемы с показом всех статей в Ленте?

Лучший ответ:
То же самое, в ленте последний пост от 25 мая 2012, 13:16 отображается (про Первый)

Худший ответ:
у меня аналогично.
Вопрос: PCI-Express 1.0 x16 vs. PCI-Express 2.0 x16 — есть ли ощутимая разница?

Лучший ответ:
1. Если оба слота имеют честных 16 линий, то на высоких разрешениях у топовых видеокарт будет потеря ~5% FPS при переходе от 2.0 к 1.0.
2. В каком смысле точную? 1 линия — 500 мегабайт в секунду. Вы подозреваете что у вас «китайские» линии с заниженной ПСП?
Сколько вы реально сможете прокачивать данных в плане CUDA — это уже совсем другой вопрос, лежащий в области практики.
3. В скорости разницы нет, в фичах разница есть (интересная скорее разработчикам плат, а не их пользователям). Реализаций нет.

Худший ответ:
Переход на PCI-E v.2 не дает преимуществ по сравнению с предыдущей

www.thg.ru/graphic/pci_express_2_crossfire/
www.thg.ru/graphic/pci_express_2_scaling/index.html
Вопрос: Парсер участников групп ВК. Проблема загрузки своих групп?

Лучший ответ:
Зачем Вы парсите m.vk.com если все что Вам нужно можно получить через API?
https://vk.com/dev/groups.getВозвращает список сообществ указанного пользователя.
UPD.:
Код вы явно не весь показали. 
Для получения списка групп нужно сделать POST на адрес m.vk.com/groups?tab=groups
В Вашем коде я вижу только авторизацию и LoadGroup() которая должна парсить HTML которого нет. Почему нет? Да потому что он генерируется аяксом в ответ на POST m.vk.com/groups?tab=groups

Худший ответ:
Как бы Вам объяснить то. Можно. Но сейчас не нужно. Сейчас я хочу узнать как правильно сделать запрос. Через API буду делать аналогичный парсер когда закончу с этим. Зачем? Практика.
Вопрос: Как обезопасить систему с полным клиентским доступом к HTML?

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

Худший ответ:
HTTPS и клиентские сертификаты. Аутентификация по сертификату (защита от кражи — можно хоть токены использовать), в результате чего получаем уникальный идентификатор пользователя — commonName из сертификата. При проверке прав (авторизации) привязывайтесь к commonName.

Общая аутентификация будет хоть на нескольких несвязанных доменах, и им даже иметь какую-то общую базу необязательно — общим на них будет только корневой сертификат вашего ЦС, которым подписаны все сертификаты клиентов.

Пароли в принципе тоже не обязательны, можно внедрить — тогда общая база будет нужна, а аутентификация получится двухфакторая.
Вопрос: Как работает переменная self?

Лучший ответ:
Lua конструктивно очень простой язык. И self это самая обыкновенная переменная, её особенность в том, что она автоматически создаётся при использовании двоеточия в объявлении или вызове функций (которые находятся внутри таблицы). Так вот self явлется ссылкой на эту самую таблицу.
Можно взять такой пример:local cat = {}
cat.name = 'Fluffy'
function cat:sayName()
  print(self.name)
end

cat:sayName()
Создаём таблицу cat, делаём строковое поле name, объявляем ещё функцию через двоеточие и появляется возможность использовать self.
Далее вот пример абсолютно идентичного кода, просто уберу весь синтаксический сахар:local cat = {}
cat['name'] = 'Fluffy'
cat['sayName'] = function(self)
  print(self['name'])
end

cat:sayName()
Или такlocal cat = {}
cat.name = 'Fluffy'
cat.sayName = function(self)
  print(self.name)
end

cat:sayName()
Или такlocal cat = {
  name = 'Fluffy',
  sayName = function(pet) -- не обязательно self
    print(pet.name)
  end
}

cat:sayName()
Или даже такlocal cat
local name = 'Fluffy'
local sayName = function() -- вообще пусто
  print(cat.name)
end

cat = {}
cat['name'] = name
cat['sayName'] = sayName

cat:sayName() -- Или просто cat.sayName() через точку

Худший ответ:
По аналогии с другими языками это this.
Прочитайте главу 16 "Объектно-ориентированное программирование" в книге "Программирование на языке Lua" Роберту Иерузалимски (рутрекер к вашим услугам).
Вот https://www.youtube.com/watch?v=F-xJq6s6lK0 видео поясняющее работу self (eng).
Вопрос: Самый удобный клиент для Livejournal под Linux?

Лучший ответ:
Firefox/Chromium — доступны асболютно все функции LiveJournal :)

Худший ответ:
а Semagic под Wine не идёт?
Вопрос: Почему иногда на сайтах пропадает текст в Firefox? Например на Хабре. Внутри пара скриншотов

Лучший ответ:
Думаю Вам легче будет сменить браузер, чем решить данную проблему.

Худший ответ:
Советы из сапорта, банальные конечно но я бы из этого начал.
Вопрос: Блок и сектор — это одно и то же, или разные вещи?

Лучший ответ:
Минимальная адресуемая область — сектор, минимум 512 байт, сейчас чаще 4096 байт. Это физическая единица.В блоке может быть несколько секторов, которые передаются как одна логическая единица. В первом случае адрес задается номером головки, дорожки и сектора, а во втором адрес логический, обработкой и занимается контроллер HDD, скорость передачи при этом вроде будет выше.

Пишу по памяти, раньше было как-то так.

Хорошая тема для статьи, кстати. Думаю, многим было бы интересно почитать, учитывая нюансы разных методов записи на винты, рассмотреть флешки, разные ФС…

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

Лучший ответ:
Ну как тут не удержаться?))
jsfiddle.net/petroveg/k7zg8/1

Худший ответ:
Посмотрите на сайте kalibroao.ru 
Вроде там то, что Вам нужно.
А если серьезно — этому примеров в сети не счесть, и самому написать недолго codepen.io/iiil/pen/mlCiB
Вопрос: Можно ли пересобрать raid 10 в 1 не снося систему?

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

Худший ответ:
Самый безопасный вариант - подцепить пару дисков в зеркало и перенести.
И я не не понял что вы имели ввиду, написав одно и тоже в  "По плану" и в "А собрал".
Вопрос: Почему не работает календарик

Лучший ответ:
На странице с работающем календарем переменная $ ссылается на mootools, там где календарь не работает $ — jQuery.
Дальше копать как-то лениво.

Худший ответ:
У меня при клике на стрелочки фаербаг говорит вот что:
$(this.options.update).empty().set is not a function
Вопрос: Книгу по Rails 3 на русском или английском?

Лучший ответ:
Как уже было написано выше, литературы актуальной нет и я думаю не будет. Рейл сообщество слишком быстро для медленных переводов и прочей чепухи.
Хочешь рейлс — english please ;) Можно начать прямо на guides.rubyonrails.org/

Худший ответ:
думаю рановато :)
Вопрос: Как зафиксировать всю интернет активность в linux?

Лучший ответ:
Wireshark, tcpdump вам поможет в анализе сетевой активности. Какие файлы "трогает" ваша утилита и какие делает вызовы, можно проверить с помощью strace и ltrace.

Худший ответ:
Для начала перекройте ему кран, пусть во внешку отдает данные только по тем портам которые необходимы.
Затем tcpdump собирайте данные с самого сервака. grep по ip. пишите в файл.
Далее этот файлик можно прогнать через uniq чтобы отсеять повторы и данных было меньше. Далее читать и искать.
Вопрос: Возможен ли доступ к OpenLDAP через MAPI? Или как может OpenLDAP прикинуться GAL?

Лучший ответ:
а ларчик просто открывался
www.openldap.org/faq/data/cache/1461.html
Пробуйте, не получится — аська 554370273, могу попробовать помочь

Худший ответ:
У ларчика оказалась забетонированная вторая крышка.
OpenLDAP не поддерживает VLV (Virtual List View). И список всех адресов (без поиска) получить не удастся. Соответственно затея лишена смысла, нужно искать другой LDAP сервер (поддерживающий VLV).
Вопрос: Какие основные и наиболее востребованные функции у CRM-систем?

Лучший ответ:
Отвечаю как представитель разработчика CRM-системы
1. если планируете разрабатывать под конкретного заказчика - то проведите аналитику бизнес-процессов, напишите и согласуйте ТЗ и вперед. Здесь может быть любой сценарий: и склад, и дебиторка, и документооборот, и... 
2. если речь о массовом продукте, то определите целевую аудиторию, пообщайтесь с представителями этой аудитории, поймите что им нужно. Здесь также от и до. 
Если пользователи продвинутые, то им без разницы веб это решение, или десктоп.
Каждый понимает CRM как ему нужно. Нет универсального решения. Но, есть базовые вещи - база компаний и контактов, планирование звонков, встреч и т.д., учет сделок. Если сделок в компании не много - то используется ручной ввод данных, если сделок много - то проводится интеграция с внешними базами, чаще с 1С.

Худший ответ:
Отвечаю как носитель опыта менее года в вялом неудачном проекте по внедрению одного из лидеров CRM рынка:
1. "Автоматизация" процесса продаж, маркетинговых процессов и аналитика - самое популярное применение CRM систем.
2. Как и в произвольном случае с современными системами (для бизнеса) - данные попадают в нее как из других систем (например, база клиентов розничного магазина может попасть в CRM систему из системы, управляющей розничными продажами), так и вручную (Вы решили стартовать новую попытку продажи своего продукта/услуги новому или существующему клиенту).
3. Насколько мне известно - нет. Бухгалтерия - это стезя ERP. В CRM отражается процесс продажи как что-то верхнеуровневое, не знаю, как тут лучше сказать. Сами же "детали" в виде проводок денег, взаиморасчетов и т.п. - это все происходит в бухгалтерской системе, там, где финансы собственно "автоматизированы". 
4. Да, но сейчас эта грань размыта. Наверняка не ошибусь, если предположу, что у всех современных (CRM) систем для бизнеса поставляется как свой независимый клиент, так и веб-интерфейс.
Вопрос: Как сделать textview=contentsize?

Лучший ответ:
я использую вот такую функцию 
задаете шрифт и ширину которую будете использовать в лабеле. И отправляете вместе с текстом. И получаете высоту текста.+(CGFloat)sizeForText:(NSString *)text withFont:(UIFont *)font withWidth:(float)width
{
	CGSize constraint = CGSizeMake(width, 20000.0f);
	CGSize size = [text sizeWithFont:font
				   constrainedToSize:constraint 
					   lineBreakMode:NSLineBreakByWordWrapping];
	return size.height;
}

Худший ответ:
Для нужного вам лейбл:
1) количество линий = 0
2) перенос линий (посимвольно , пословам)
и все! у меня работает - лейбл растягивается ! если нужен код поищу, пишите!
Вопрос: Как программно включить/отключить CapsLock?

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

Худший ответ:
Вообще в чём смысл?
Вопрос: Как разнести слои по сетке в Photoshop CS6?

Лучший ответ:
Я думаю этот туториал поможет Вам.

+Бонус плагин

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

Лучший ответ:
Какими языками, технологиями и средами владеете - те и используйте. Т.к. подробностей что за "обучающее пособие" нет - то ответить можно так. Если есть более подробная постановка задачи - исходите из нее. Например, требуют чтобы был учет по юзерам +кроссплатформенность - юзайте Php. Можно standalone - попробуйте с++. Нужен просто вывод статей и картинок - можно и чистый HTML+JS.

Худший ответ:
реализовать в игровой форме в зависимости от ваших знаний