Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Почему NOSQL  БД становятся популярными?

Лучший ответ:
NOSQL БД не становятся популярными, а занимают свою нишу. 

NOSQL никогда не заменит реляционные SQL. Есть направления, в которых NOSQL эффективны, и есть другие направления, в которых SQL эффективна. Сейчас идёт процесс перераспределения сфер применения этих решений.

Худший ответ:
всё просто. есть задача: небольшая, заведомо влезающая в оперативку база данных, простая схема БД, простые запросы, большинство тупо по первичному ключу потеря данных не критична.
основная особенность — *много* (очень) *простых* запросов. их надо выполнять быстро. значит
1) все держим в памяти
2) отказываемся от языка запросов, убираем расходы на парсинг и кэши планов, оптимизацию
3) отказываемся от ACID

получаем то то получаем — IN MEMORY молотилку запросов.
Вопрос: Как жить дальше?

Лучший ответ:
меня порой разочаровывал инструментарий
Не устраивает используемый стэк технологий?И очень часто получается так, что если я сталкиваюсь с какими-то проблемами, никто не может мне помочь.Никто не оценивает мой код,
Наличие грамотного наставника очень важно для начинающего специалиста. Дает существенный прирост к профессиональному развитию на старте.За время моей работы в этой компании я забыл некоторые технологии
Если они вам более интересны, чем те, с которыми работать приходится по долгу службы, то это явный сигнално не нравится ЗП
No comments
У вас достаточно причин покинуть данное место.

Худший ответ:
Уйти во фриланс. Подучить английский и пробовать англоязычные биржи upwork, freelancer.
Вопрос: Обучение ИТ-специалистов — онлайн или оффлайн?

Лучший ответ:
отвечайте только Онлайн или Оффлайн
Оффлайн

P.S. может тогда в виде опроса оформить?

Худший ответ:
Спасибо всем за ответы!

Дальше разовьем тему в опросах с пояснением.
Вопрос: Безопасность и разрешения android устройств. Для чего требуют информацию о телефоне и звонках?

Лучший ответ:
По первому вопросу - да, сможет. А так как приложение не единственное, разработчик сможет построить обширную сеть ваших контактов.
Так как Андроид - профурсетка коммерческая, единственный способ ограничить приложения друг от друга - заполучить ROOT права и поставить XPrivacy.

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

Лучший ответ:
У меня T420 (тот, который второй, 1600×900 / LED / NVS 4200M / 1024 Мб / DVD±RW DL SM / BT / / 6 Cell / Win 7 Pro 64 / 2.24 кг).
Сразу скажу — работаю на Убунту. Работает все, включая фингерпринт и подсветку клавиатуры. Не работает регулировка яркости подсветки, но это общая болезнь всех ноутов, как я понял. Не особо мешает.
Плюсы — легкость апгрейда до нужного состояния. Купил планку памяти на четыре гигабайта, открутил один болт, встатвил — теперь у меня памяти 8 гигабайт. Планирую прикупить допбатарею вместо DVD-привода.
Минус — немного разболтались шарниры крышки. То ли это оттого, что ноут у меня один раз уже падал клавой-крышкой вниз (в раскрытом виде), то ли особенность конструкции — не знаю. Хочу починить/поменять корпус.
Еще один небольшой минус — трекпойнт быстро испачкался. Запасных в комплекте нет, придется заказывать в Китае.
По поводу шума — его не слышно. Если собираетесь запускать что-то графически тяжелое, типа игр (например, World of Tanks ездит неплохо, Minecraft тоже, Counter-Strike запускал без лагов), то лучше в биосе включить турбовыдув. Тогда ноут начинает свистеть как реактивный самолет — по характеру звука, а не по громкости :) Громкость в пределах нормы.
Греется в районе кнопки Esc (снизу), под ней радиатор находится и кулер.
Вроде как все свои впечатления описал. Ноут хорош. Особенно радуют матовые поверхности. Протер тряпочкой влажной — стал как новый.
Да, и еще. Один раз пролил пиво на клавиатуру. Пиво вытекло снизу. Выключил, оставил на ночь на просушку — работает.

Худший ответ:
Всем огромное спасибо. Все мнения очень пригодились, в итоге решил брать ноутбук от Lenovo, разве что T420 сменил на X220 — снижение массы оказалось для меня критичнее мощности и наличия привода. Еще раз спасибо.
Вопрос: Как можно заработать на плагине чата для разных CMS?

Лучший ответ:
Есть ли у вашего модуля киллер-фишки? Если есть уже бесплатный модуль с аналогичным функционалом - то зачем покупать что-то?
На основании опыта могу сказать, что в России если есть бесплатная версия годного продукта - ее и будут использовать, а недостающий функционал допишут сами
Можете попытать счастье на стоках типа codecanyon.net, лично я склоняюсь ко второму варианту, но разница между платной и бесплатной версией должна быть ощутимой, а платная версия должна быть действительно крута, функциональна и удобна. 
Есть эпизод с защитой от копирования, тут нужно будет подзаморочиться, к примеру приделать api со сверкой ключа и привязкой к домену и часто обновляться - тогда распространять бесплатно ломаную версию не будет иметь смысла

Худший ответ:
В теории может быть можно попробовать так - бесплатный модуль и индивидуальные платные доработки под конкретные пожелания. Но если честно - это же чат, перспективы туманны. В двух словах вы написали - "я написал чат, а теперь хочу денег". Вы можете спамить разработчиков CMS текстом - "я написал классный чат, давайте за чуток денег запилим его в ваш продукт".
Вопрос: Каким образом отслеживать загрузку VLAN по SNMP на оборудовании CISCO?

Лучший ответ:
>Но у меня не получилось получить нужный OIDы для VLAN в Cisco 3750-2 
А как вы искали? Есть прекрасная программа - называется snmpwalk. С его помощью можно вытащить все OID. Советую сохранять вывод в файл, потому что процесс это долгий и потом проще будет грепать нужные OID по ID интерфейса. Находим ID нужного интерфейса, например:
IF-MIB::ifDescr.138 = STRING: FastEthernet0/0.25
И потом грепаем по ID и находим нужные нам строки:
IF-MIB::ifInOctets.138 = Counter32: 3066094
IF-MIB::ifOutOctets.138 = Counter32: 1929934
Или можно не грепать, а сразу подставить значение ID интерфейса.

Худший ответ:
ну если есть миб который показывает загрузку влана то по нему и отслеживайте, а если нету то , то никак
Вопрос: Удаленное соединение с сервером?

Лучший ответ:
IMHO между сервером и «Интернетом» (это такой шнурок который к вам тянется от провайдера) стоит «коробочка». Вот в этой «коробочке» нужно настроить прокидывание пакетов из интернета на определенный IP внутри вашей внуренней сетки. Копайте в сторону «port forwarding» или «virtual server» в доках по «коробочке». Обычно к коробочке можно подключиться по 192.168.0.1 или 10.10.1.0 

ЗЫ. Как мог перевел на тот язык, которым был задан вопрос.

Худший ответ:
Открыть порт на внешку в Windows Server 2003, открыть порты на оборудовании. Но не совсем понятно, что значит удаленно подключиться к программам? Подключиться через удаленный рабочий стол или подобную систему? Уточните пожалуйста.
Вопрос: Как опмитизировать кусок кода PHP?

Лучший ответ:
Вы издеваетесь что ли?
Оставьте этот код в покое, тоже нашлись мне мегаоптимизаторы.Можно ли посадить эту часть кода на memache? - Можно, но не нужно

Худший ответ:
Выбранный пользователем язык храните в куках (не сам язык, конечно, а его метку), если без авторизации. Если с авторизацией, то можно и в  БД записывать. Смотря чего хотите. 
Но в любом случае какую то проверку или другую манипуляцию вам делать придется, для подключения определенного языка. Но не переживайте, на производительности это не отразится. Хоть 100 раз эту проверку делайте, не заметите разницы.
Оптимизировать надо настройки сервера, PHP, БД, кешировать результаты длительных вычислений и медленных запросов.
В коде, обращайте внимание на участки с перебором массивов, вложенными массивами. Именно там скорее всего может возникнуть проблема с производительностью.
Если вы ничего криминального в коде не делаете, запросы к БД быстрые, обращений к внешним ресурсам нет, но скорость работы сайта низкая, то скорее всего тормозит ваш сервер ввиду неправильной.
Вопрос: Какой самый приватный мессенджер?

Лучший ответ:
По приоритету я бы составил список так:
Antox (Android), Antidote (iOS) - клиенты Tox https://tox.chat/clients.html
Threema, Signal, Telegram, Whatsapp (правда здесь вы светите свой мобильный номер).
Viber уже тоже end-to-end шифрование ввёл.

Худший ответ:
Почта России.
Вопрос: Redis теряет данные?

Лучший ответ:
Кажется разобрались.
Виной кривой драйвер для Node.JS — node_redis

Отказались от Redis в пользу mysql memory, производительность радует

Худший ответ:
А вас кольца (ring) нет?
Вопрос: Подкиньте задания по ангуляр!?

Лучший ответ:
Обход конем, покер, жизнь - задачи, никак не связанные с Angular. 
Хотите ангуляр, пишите директивы для разных задач. В контексте покера и обхода конем - например директива для шахматной доски, принимающая формат pgn, ну или для покерной раздачи (посмотрите на покерных форумах).

Худший ответ:
Привет. Есть один проект, но с бэкэндом и прочими заморочками (всё нарисовано и сверстано), но посерьёзнее интернет-магазина. Если будет интересно - пиши. Ang + larv
Вопрос: Как настроить прокси сервер?

Лучший ответ:
При условии того, что в браузере ничего менять не надо, Вам нужен прозрачный прокси. Как вариант, нужно задействовать маршрутизацию на шлюзе, и пересылать все пакеты идущие на 80й порт на прозрачный прокси (например на порт 3128) а на этом порту поднять прокси в режиме транспарент (для сквида это строка в конфиге http_port 3128 transparent ) 
Примеров конфигурации предостаточно, например https://habrahabr.ru/sandbox/39160/
Обратный прокси: можете воспользоваться Nginx нужна вам строка в конфигурации будет выглядеть примерно так location / 
{
proxy_pass http://$http_host;
}В процессе настройки, пользуясь документацией сможете настроить под ваши задачи

Худший ответ:
proxy - требует настройки в каждой софтине , так что скорее всего вы говорите о NAT ?
https://habrahabr.ru/sandbox/18975/
Вопрос: Как отправить POST запрос (HTTPS с использованием TLS) (на сайт гос закупок)?

Лучший ответ:
Решил проблему, надо было установить корневой сертификат УЦ Казначейства и КриптоПРО.

Худший ответ:
Может быть эти ссылки помогут
Вопрос: Чем пользоваться на mac os el capitan для веб разработки?

Лучший ответ:
Попробуйте  Vagrant. И система чище, и нативный воркфлов

Худший ответ:
Извините но на маке извращение ставить вагрант.. ну если только не что то специфическое...
ставте brew и через него поставте все что нужно.. мне лично хватает  
nginx - php-fmp - mysql - redis
но на всякий пожарный держу VirtualBox
Вопрос: Вопрос по индексам MySQL?

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

Худший ответ:
Скорее всего разницы никакой не будет, поскольку и в том и в другом случае количество записей с флаг =0 или processed_time = 0 одинаковое. Индекс на processed_time только позволит намного быстрее делать статистические запросы с количеством обработанных заданий во временных промежутках (нужно ли вам это?).
У индекса есть такое значение как cardinality (дословно с англ: «мощность»). И чем ближе значение этого свойства к общему количеству записей — тем быстрее работает поиск по индексу.
Вопрос: С формой отправляю время заполнения. Как добавить 2 часа к времени сервера?

Лучший ответ:
Работайте в UTC, а в локальное время переводите только для отображения.

Худший ответ:
Используйте date_default_timezone_set до вызова функций даты\времени. 
В помощь: Список поддерживаемых временных зон.
Вопрос: Rак правильно организовать списание баланса?

Лучший ответ:
Если у Вас операция НЕ АТОМАРНАЯ, то нужно обернуть в транзакцию
Частично тут описано - php.net/manual/ru/pdo.transactions.php

Худший ответ:
Никогда так не делайте. Считайте остаток баланса на сервере СУБД в запросе на апдейт 
PS: как работать со списаниями можно почитать, например, начав отсюда https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%B1%D...
Вопрос: Вертикальное меню CSS

Лучший ответ:
А что мешает самому сделать большое поле? jsfiddle.net/alexseroshtan/b5LVP/

Худший ответ:
Готовое решение
jsfiddle.net/Eugeny/us0peef6
Вопрос: 3D модель дивана на сайте

Лучший ответ:
WebGL вполне справится. Flash — древняя кривая технология, которая должна помереть. Но, как правильно говорили выше, лучше все-таки реальные фотографии.

Худший ответ:
Основной вариант — круговое фото товара и обертка для просмотра на флеше. Пример можно посмотреть на superholodilnik.ru

Примеры более «настоящих» 3D-моделей можно найти в маркете, но они тоже рендерятся далеко не в браузере (особенно заметно по бликам освещения).
market.yandex.ru/model.xml?modelid=6988661&hid=91148&int_lnk=p-goods-img
market.yandex.ru/model.xml?modelid=2556530&hid=91148

Пару лет назад был стартап Roomix, как раз занимались 3D-моделями мебели для сайтов. Стартап кончился, но его создатели Андрей Глинский и Илья Лагутин, возможно, смогут рассказать Вам много интересного.
Вопрос: Как правильно создать виртуальное окружения для python?

Лучший ответ:
Вы пишите:Создаю виртуальное окружение
virtualenv -p /usr/bin/python3 venv
source venv/bin/active
А потом пишите:команда which python показывает что используется питон системный.
Вы понимаете что изначально указывали путь до родного питона?

Худший ответ:
Почитайте тут.
Вопрос: Почему не работает функция em() в sass?

Лучший ответ:
Потому что нужно написать миксин:$browser-context: 16; // Default

@function em($pixels, $context: $browser-context) {
  @return #{$pixels/$context}em;
}
Вызывать без указания px для пикселей.

Худший ответ:
sass не имеет встроенной функции em
em хорошо было использовать для ие6-7
Вопрос: Чего то я не понял с функциями из библиотеки string.h?

Лучший ответ:
Все функции из пакета возвращают число int.
Во-первых, string.h - это не пакет, а набор объявлений для группы функций из стандартной библиотеки функций языка C. То есть библиотека включает в себя вообще все функции, а файлы с объявлениями позволяют подключать (объявлять) их только нужными группами.
Во-вторых, не все функции для работы со строками возвращают int. Это ты сам придумал, где-то что-то перепутав. Строковые функции бывают разными - и возвращающими int, и возвращающими char *, и возвращающими size_t. Функция strstr() возвращает char * - указатель на начало найденной подстроки, либо NULL, если подстрока не найдена.
Если тебе нужно определить позицию найденной подстроки в строке, то нужно из адреса этой подстроки вычесть начало всей строки.

Худший ответ:
Смотрите документацию. тык
Не скажу за все, но обычно функции из string.h возвращают null, либо указатель на ячейку. Чтобы получить номер ячейки надо брать их разность.
Вопрос: Можно ли монетизировать ролики переозвучки?

Лучший ответ:
Нашёл интересную статью, и судя до ней, есть шансы, что видео примут за добросовестное использование.
fairusetube.org/guide-to-youtube-removals/3-decidi...

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

Лучший ответ:
Задача о рюкзаке, даже о двух :)
Заводите массив M[0..S/3,0..S/3] (можно битовый, но лучше побольше - чтобы хранить обратные ссылки). В нём будут отмечены элементы M[a,b], такие, что из уже просмотренных элементов текущего набора можно выбрать непересекающиеся подмножества с суммами a и b.
Когда приходит очередной элемент x - выполняете M[a,b]=M[a,b] | M[a-x,b] | M[a,b-x] для всех a,b начиная с конца (с больших a,b). Если при этом 0 сменился на 1 - помечаете в массиве обратных ссылок, из какого элемента вы сюда попали.
Сложность - O(n*S^2). Можно ли сделать лучше, не знаю.
Вот вариант кода - но он печатает только два множества. Как напечатать третье, разберётесь.spoilerstatic void Main(string[] args) {
            int[] dat=Array.ConvertAll(Console.ReadLine().Split(' '),int.Parse);
            int S=0;
            foreach(int x in dat) S+=x;
            if(S%3!=0) {
                Console.WriteLine("-1"); return;
            }
            S/=3;
            int[,] M=new int[S+1,S+1];
            M[0,0]=-1;
            foreach(int x in dat) {
                for(int a=S;a>=0;a--) {
                    for(int b=S;b>=0;b--) {
                        if(M[a,b]==0) {
                            if(a>=x && M[a-x,b]!=0) M[a,b]=x;  // back by set1
                            else if(b>=x && M[a,b-x]!=0) M[a,b]=-x;  // back by set2
                        }
                    }
                }
            }
            if(M[S,S]==0) {
                Console.WriteLine("-1"); return;
            }
            int u=S,v=S;
            string res1="",res2="";
            while(u!=0 || v!=0) {
                if(M[u,v]>0) {
                    res1+=" "+M[u,v]; u-=M[u,v];
                } else {
                    res2+=" "+(-M[u,v]); v+=M[u,v];
                }
            }
            Console.WriteLine(res1);
            Console.WriteLine(res2);
        }

Худший ответ:
Но как действовать дальше? 
Какой-то рекурсивный алгоритм, где:
1. набираем элементы до суммы S/3 в 1-е множество ...
2. для каждой найденной комбинации п.1 набираем элементы до суммы S/3 в 2-е множество ...
3. смотрим равна ли сумма того, что осталось S/3?
Дерево поиска.
Как вы не мудрите, итоговое решение будет вариантом такого.
Можно придумать что-то из жадных алгоритмов, чтобы сразу не углубляться в рекурсию на всю глубину.
Хорошая задача ... 
Но громоздкая, поэтому сюда не помещаю.
Вот вариант решения: примеры задач при изучении C++$ ./3set
Вводите числа построчно (пустая строка - конец ввода):
1 2 3 4
4 5 8

{ 1, 2, 3, 4, 4, 5, 8 } ->
{ 1, 8 }
{ 4, 5 }
{ 2, 3, 4 }
Вопрос: Система рейтинга постов

Лучший ответ:
Я бы посоветовал Вам хранить рейтинг в два этапа. Допустим голосовать можно один раз в день за любое количество постов. Тогда вам нужно две таблички:
1. Табличка с дневными данными, и соответствующая ей модель(DayVote).
 .----------------------------------------------------------------------------------------
 | ID_ПОЛЬЗОВАТЕЛЯ | ID_ПОСТА | ОЦЕНКА | ПОСМОТРЕЛ_РЕЗУЛЬТАТ |
 -----------------------------------------------------------------------------------------.
2. Табличка с агрегированными данными и соответствующая ей модель(PostVote):
 .----------------------------
 | ID_ПОСТА | ОЦЕНКА |
 -----------------------------.
Эта табличка должна заполняться по крону автоматом 1 раз в сутки, собирая и агрегируя данные из DayVote, после чего DayVote нужно очистить. 

Приимущества такого подхода:
1. Максимальное количество записей в таблицах будет равно количеству постов+ количеству проголосовавших за сегодня. А это гораздо меньше чем общее количество голосов.
2. Простота схемы данных.
3. Можно расширить DayVote служебными данными (как-то IP, USER_AGENT и т.п.), и в скрипте, обновляющем PostVote и проводить автоматический анализ и фильтрацию голосов, не боясь за то, что база разрастется.
Недостатки:
1. Усложняется процесс выбора количества голосов для поста (его теперь нужно выбирать из двух таблиц).
2. Нужно логировать запуски крон скрипта, и следить за логами, чтобы агрегирование выполнялось «гладко».

Худший ответ:
Во втором варианте сделайте 1 поле, RATING к примеру, там будете хранить либо 1, либо -1.

Затем индекс по ID_ПОСТА + SQL SUM по этому полю. В итоге все должно шустро отрабатывать, если сервер будет напрягаться, то можно попробовать кешировать или же сделать еще одну таблицу, в которую будете писать и триггером раз в N времени данные записывать в основную (из которой вы показываете данные).
Вопрос: Как получить apple distribution certificate без наличия ООО?

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

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

Лучший ответ:
Яндекс.Касса - 100%
Заявки рассматривают со скоростью света.
Но там, проценты канешн... Зато - all inclusive.

Худший ответ:
paymentwall,  судя по вашим условиям
но они свой процент возьмут, имейте в виду
Вопрос: Как в хабратопике форматировать таблицу?

Лучший ответ:
Вставляйте текст картинками, чем Вы хуже Бумбурума:)

Худший ответ:
Никак, хабр вырезает все атрибуты из тегов, кроме разрешенных. Разрешенные аттрибуты описаны там где список разрешенных тегов.
Вопрос: Как выучить C# в 14 лет без знаний программирования?

Лучший ответ:
ITVDN Unity3D
Гуглите такие вопросы, на toster уже раз 5 видел лично такой же вопрос, и каждый раз одно и тоже.

Худший ответ:
Держи учебник. Для юньки должно хватить с головой. Ну и вот это до кучи. Учить просто. Читай учебник, разбирайся и старайся сразу написать програмку, в которой будут применяться новые знания.
Вопрос: IDE под Node.js

Лучший ответ:
Использую PhpStorm 6
В данный момент полностью все настраивается, запускается, доставляется, дебажится из самой IDE. Очень удобно.

Худший ответ:
В качестве альтернативы еще можно Komodo Edit пользоватся, он бесплатный, но не такой крутой как WebStorm
Вопрос: Управления временем в Python?

Лучший ответ:
Как и сказал Sergey6661313 вам нужно использовать QTimer. Класс QTimer испускает сигнал timeout спустя заданное время. 
Вот пример использования QTimer с QProgressBar. Таймер испускает сигнал timeout каждую секунду, по сигналу вызывается метод on_timer в котором происходит инкрементирование QProgressBar, после заполнения прогресса таймер останавливается.from PyQt4 import QtGui
from PyQt4 import QtCore

class Widget(QtGui.QWidget):
    
    def __init__(self, parent=None):
        super(Widget, self).__init__()
        layout = QtGui.QVBoxLayout(self)
        self.pb = QtGui.QProgressBar()
        self.pb.setMaximum(100)
        self.pb.setMinimum(0)
        self.pb.setValue(0)
        layout.addWidget(self.pb)
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.on_timer)
        self.timer.start(1000)

    def on_timer(self):
        current_value = self.pb.value() + 1
        self.pb.setValue(current_value)
        if current_value == 100:
            self.timer.stop()

if __name__ == '__main__':
    app = QtGui.QApplication([])
    w = Widget()
    w.show()
    app.exec()

Худший ответ:
в __init__:
self.timer = QtCore.QBasicTimer()
self.timer.start(1000, self)   # 1000 - наша задержка (должна быть в миллисекундах помоему)
и определите метод:
def timerEvent(self, event)
    self.follow.setValue(self.follow.value() - 1)
и да переменная hp не нужна. follow уже содержит переменную доступ к которой осуществляется через value() и setValue(), поэтому плодить сущности незачем.
В кратце QBasicTimer это что-то вроде Qthread котороый каждые  обозначенные миллисекунды вызывает событие timerEvent обозначенного обьекта.
Вопрос: Веб-движок для блок-схем?

Лучший ответ:
visjs.org
вот хорошая библиотечка

Худший ответ:
Смотри в сторону HTML5 Canvas, существует даже ряд фреймворков типа Fabric.js
На хабре довольно много постов про разные решения с использованием Canvas.
Вопрос: Как сделать многоязычного бота в телеграм?

Лучший ответ:
Было

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

Лучший ответ:
Хорошая документация

Худший ответ:
Laravel. Там должен быть реализован laravel)))