Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Поведение массивов как в PHP на JS или JQUERY?

Лучший ответ:
А в чем собственно проблема? Код ниже вполне работоспособен:arr = {}
arr['window'] = {}
arr['window']['settings'] = {}
arr['window']['settings']['key'] = 123

// и так можно

arr = { window: { settings: { key: 123 } } }

Худший ответ:
однако простой JS не позволяет так делать, возможно есть какие-либо библиотеки для этого или функция
Вполне себе позволяет, только используются для этого не массивы, а объекты
Объекты надо инициировать заранее, то есть в существующий объект можно добавить новый ключ, но если объект не существует, то и добавлять этот ключ некуда.
Пример://у нас есть пустой объект array = {}
//Мы делаем следующее:
array['window']['settings'] = { key: value };
//На деле происходит все так:
{
let temp = array['window']; // undefined
temp['settings'] = { key: value }; // Ошибка, у undefined не может быть полей
}
Формально и это можно обойти с помощью Proxy (не работает и никак не полифилится в старых браузерах, все ie а так же safari ниже 10 сразу отпадают)
Но делать так не хорошо, ибо в такой реализации если мы запросимarray['window']['settings']['other_key'], то получим пустой объект, хотя ожидается undefined
Если Вас это не останавливает, могу накидать простенькую реализацию, дабы Вы сами смогли наступить на грабли плохого кода и научится на собственных ошибках
Вопрос: Какие есть ip-камеры тонкие?

Лучший ответ:
KT&C KPC-E190PUDV - аналоговый видеоглазок.
AVT AHDCH 108 - HD-аналоговый видеоглазок.
В сторону pin-hole даже не смотрите - УК РФ, крайне не советую.
http://forum.videon.spb.ru/viewtopic.php?f=1&t=138...

Худший ответ:
Думаю вам надо искать USB Endoscope камеру с wi-fi приставкой - они будут тонкие до 7мм
https://ru.aliexpress.com/wholesale?SearchText=wi-...
Искать с форматом h264 если в систему видеонаблюдения - MJPEG только для работы с компом или планшетом.
Но в руках не держал - поэтому не могу сказать как там оно работает.
Вопрос: Организация заметок вроде Evernote, но НЕ Evernote. Может что-то под Dropbox?

Лучший ответ:
>Копирую простой текст с сайта
ctrl+shift+v?

Худший ответ:
Можете попробовать springpad.
Вопрос: Что с php.net?

Лучший ответ:
Поробуйте это php.net/?beta=1

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

Лучший ответ:
www.interface.ru/home.asp?artId=21283Лицензии на средства разработки бывают трех типов: Коммерческая лицензия позволяет: использовать продукт для разработки ПО/распространять разработанное ПО/распространять компоненты ПО (например BDE), которые перечислены в лицензии на распространение.Ознакомительная (Downloads) лицензия: позволяет ознакомиться и исследовать ПО/ограничена во времени (30 дней)/не позволяет вести никакую разработкуОбразовательная (Academic) лицензия позволяет: Использовать продукт в целях изучения на курсах по программированию/Использовать продукт для обучения программированию/Не позволяет вести разработку, которая может быть использована вне процесса обучения 
Вот тут список доступных коммерческих лицензий https://www.embarcadero.com/ru/app-development-too... 
Обратите внимание на пункт "Лицензия на коммерческое использование", в котором для Starter указано "С ограничениями", что означает:*If you’re an individual you may use the Starter Edition to create apps for your own use and apps that you can sell until your revenues reach $1,000 per year. If you’re a small company or organization without revenue (or up to $1,000 per year in revenue), you can also use the Starter Edition. Once your company's total revenue reaches US $1,000, or your team expands to more than 5 developers, move up to the Professional edition with an unrestricted commercial license.
Остальные лицензии позволяют распространять ваше ПО без ограничений.

Худший ответ:
Что более важно, (т. к. одну лицензию можно и купить) как ведется работа над Delphi OpenSource проектами?
Обратитесь в саму контору-владелицу Delphi.
Возможно, под open source да в ВУЗе они вообще бесплатно десяток лицензий предоставят.
Вопрос: Возможно ли вытягивать данные с MySQL асинхронно и мгновенно, совершенно без задержек?

Лучший ответ:
Периодическая предварительная выборка через тот же Ajax. Двойная буферизация, только так будет создана иллюзия отсутствия задержек. Иначе как если время на выборку тратиться, время на передачу данных тратиться - а отображается мгновенно? Концы не сходятся с концами.

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

Лучший ответ:
Выбейти у тех. дира/начальника IT-отдела доступ для аудита: если железки могут в Netflow, то заведите ntop-ng и пустите в него, если нет - read-only доступ к SNMP, данные с которого можно обрабатывать стеком Telegraf/InfluxDB/Grafana, например.

Худший ответ:
А политика безопасности в вашей большой компании документирована? За сбор информации, да еще полученный со своим обычным доступом конечно вряд ли что будет, но попытка использовать обнаруженные дыры может привести к не слишком приятным последствиям
Вопрос: Не ли в коде PHP чего-то лишнего?

Лучший ответ:
В целом, приятно видеть, что люди используют PDO, а не mysql_query.
Глазик не дергался от ужаса. Вроде, все отлично.
Остального не видел, но убедитесь, что у вас разделена логика от представления.

Худший ответ:
Несколько пугает текст "страница тегов,поиска". Не должно быть на страницах представлений и разметки - sql. Ни в каком виде. Только вызов методов класса, внутри которых уже могут прятаться запросы в бд. Ну и не привыкайте к звездочке. При использовании join появится много мусора. Так же рекомендую оградить доступ к бд до уровня "только хранимые процедуры". Поддержка sql-кода станет попроще. Перепишете хранимку, а приложение останется нетронутым
Вопрос: Голосование за сущности (когда голосов и сущностей много)

Лучший ответ:
1 500 000 это не много.

Вариантов работы с большим количеством данных множество. Зависит от того, какие цифры нужно получить. К примеру, если не нужно помнить кто конкретно за что конкретно голосовал, то можно данные агрегировать. Т.е. взять сущность, посчитать сколько голосов отдано за период Х и запись в базу одной запись, а из таблицы с голосами для данной сущности за этот период голоса удалить.

Если нужно все и всегда, то бъем таблицу на куски и старые записи просто сохраняем в архивные таблицы. Данные метод совершенно не исключает агрегирования, он просто помнить все голоса в системе.

P.S. Можно. Я без проблем нашел свой голос 2-ей давности.

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

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

Худший ответ:
Можно в таких случаях.
1. Если у шаблона ровно N специализаций и (N+1)-й быть не может.
2. Если он private и его синтаксически невозможно вызвать откуда-то ещё, кроме CPP.
3. template<> (полностью специализированная функция без шаблонных параметров). Ей место именно в CPP, если она общедоступная и не inline.
Стек, очевидно, ни к одному из этих случаев не относится.
Код создаёт не сам шаблон, а его расшаблонивание!
Вопрос: Реально ли сейчас сделать «крутую» игру, имея такое изобилие инструментов?

Лучший ответ:
Уровня крайзис - никак. Как вы себе представляете, как пару соратников смогут создать, написать и главное протестировать весь контент?
Как вы собираетесь продать это все, избежать попадания на торренты?

Худший ответ:
Все упрется в объем и качество контента. Не зря ведь команды таких игр весьма велики. Чтобы сделать за разумное время и с хорошим качеством надо распараллеливать работу. Размер команды соответствует размеру игры. Если у вас маленькая команда - то попробуйте сделать маленькую, но хорошую игрушку. Получите опыт и сможете сделать что-то более сложное. Дефицит обычно не в инструментах, а в идеях.
Вопрос: Как прописать путь к css файлу из html-файла в папке в папку с scc?

Лучший ответ:
../../../css/main.css попробуй

Худший ответ:
../css/main.css   оказался верным...  У меня галп тупил)
Вопрос: wysiwyg Markdown редактор

Лучший ответ:
Пользуюсь MarkitUP (Сайт). Насчет content editable не могу сказать, остальное есть. Даже если не хватает чего то допилить имеющееся часто проще чем писать свое с нуля.

Худший ответ:
Посмотрите Aloha editor. Удовлетворяет большинству ваших требований, но не markdown. Правда все еще остается возможность конвертировать полученный от редактора HTML в Markdown на сервере перед сохранением.
Вопрос: Какая разница между строковыми методами в Python с двойным подчеркиванием и без?

Лучший ответ:
Говоря о специальных методах, нужно все время помнить, что они предназначены для вызова интерпретатором, а не вами. Вы пишете не my_object.__len__ (), а len(my_object), и, если my_object - экземпляр определенного пользователем класса, то Python вызовет реализованный вами метод экземпляра __len__. Однако для встроенных классов, например list, str, bytearray и т. д., интерпретатор поступает проще: реализация функции len() в CPython возвращает значение поля ob_size C-структуры PyVarObject, которой представляется любой встроенный объект в памяти. Это гораздо быстрее, чем вызов метода.
Как правило, специальный метод вызывается неявно. Например, предложение
for i in х: подразумевает вызов функции iter(х), которая, в свою очередь, может
вызывать метод х.__iter__ ( ), если он реализован.Лучано Рамальо "Fluent Python"

Худший ответ:
Разницы нет никакой. Это простое удобство.
Вот, например, по поводу метода __add__ документация сообщает:For instance, to evaluate the expression x + y, where x is an instance of a class that has an __add__() method, x.__add__(y) is called.
Т.е. когда вы пишите a+'-678', то за вас это будет преобразовано в a.__add__('-678')
P.S. Про __len__  - https://docs.python.org/3.5/reference/datamodel.ht...
Там же находится и описание других методов.
Вопрос: Как положительные числа преобразуются в отрицательные?

Лучший ответ:
Читаем про знаковые и безнаковые типы переменных. Внимательно читаем!

Худший ответ:
+/- нет в памяти. Есть только 0/1. Запись отрицательных чисел, как вы показали, называется дополнительный код. Он удобен при счете, так как практически не отличается от счета беззнаковых чисел.
Например (8 бит):-
  00000010 (2)
- 00000100 (4)
  --------
  11111110 (-2)

  11111111 (-1)
+ 00000011 (3)
  --------
 100000010 (2) - здесь старший бит отбрасывается, так как у нас не больше 8 бит
Вы правы, если рассматривать 11111111111111111111111111111110 как беззнаковое число, это 4294967294. Но это знаковое число! Старший (первый) бит показывает 1, значит, это отрицательное число.
1. Инвертируем биты: 00000000000000000000000000000001
2. Прибавляем 1: 00000000000000000000000000000010
3. Переводим в десятичную систему: 2.
4. Добавляем -: -2.
Вопрос: Где/как/на основе какой CMS/LMS лучше создать сайт с курсами (платными и бесплатными), чтобы было всё на русском и имело много способов оплаты?

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

Худший ответ:
а шо за курсы то будут?
Вопрос: Можно ли в yii2 в процессе работы модели ActiveRecord подтянуть в нее повторно данные из БД?

Лучший ответ:
есть метод refresh(); у модели, по вашему описанию должно помочь, а так же будет полезно прочесть про оптимистическую блокировку

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

Лучший ответ:
это личное дело каждой команды. можно, например, git flow

Худший ответ:
Вот здесь почитай : nvie.com/posts/a-successful-git-branching-model
Вопрос: Будет ли Swift мультиплатформенным?

Лучший ответ:
Будет.
Его уже на линукс перенесли.

Худший ответ:
Я вот пока не уверен. Вы должны понимать, что язык это многое, но не все. 
Тот же Objective-C доступен на многих платформах, но без Cocoa[Touch] он нахрен никому не нужен. Вот есть опасение, что без такого же framework'a swift так же останется изолированным только для платформ от Apple, потому как последняя мало заинтересована в развитии сторонних платформ. Покажет лишь время.  Пока свифт цветет и пахнет, вон даже скриптовый язык сделали для научных целей (swift-lang.org/main/index.php)
Вопрос: Windows 10 — недостаточно памяти. Как исправить?

Лучший ответ:
Включите файл подкачки.

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

Лучший ответ:
Для начала НЕ ДОЛЖНО быть одинаковых id, так как он обязан быть уникальным

Худший ответ:
Решил вопрос без js, используя flex, понимая, что старые браузеры не потянут его. Сам код в натуральном его виде из комплексного компонента каталога Битрикс характеристик карточки товара:<dl class="product-item-detail-properties">
<dt>Артикул</dt><dd>100172</dd>
<dt>Базовая единица</dt><dd>шт</dd>
...
</dl>
CSS:.product-item-detail-properties {
    display: flex;
    flex-wrap: wrap;
}
.product-item-detail-properties dt {
    clear: both;
    flex: 0 0 50%;
    overflow: hidden;
    font-weight: bold;
    font-size: 13px;
    padding: 5px 0 5px 10px;
   border-bottom: 1px solid #e5e5e5;
}
.product-item-detail-properties dd {
    font-size: 13px;
    flex: 50% 0 0;
    padding: 7px 0;
    margin: 0;
    border-bottom: 1px solid #e5e5e5;
}
/*чередующийся цвет колонок*/
 .product-item-detail-properties dt:nth-child(4n+1),  .product-item-detail-properties dd:nth-child(4n+2) {
   background: #fbfbfb;
}
Вопрос: Я чайник: Откуда можно закачать последние обновления для винды одним файлом?

Лучший ответ:
Ежемесячный выпуск DVD образов «Security Release ISO Image»:
https://www.microsoft.com/en-us/download/search.aspx?q=Security%20Release%20ISO%20Image&p=0&r=10&t=&s=availabledate~Descending
This DVD5 ISO image file contains the security updates for Windows released on Windows Update on %month% %day%, %year%. The image does not contain security updates for other Microsoft products. This DVD5 ISO image is intended for administrators that need to download multiple individual language versions of each security update and that do not use an automated solution such as Windows Server Update Services (WSUS). You can use this ISO image to download multiple updates in all languages at the same time.


Или вытянуть пачкой по конкретному продукту\версии:
catalog.update.microsoft.com/

Худший ответ:
С сайта МС — точно нельзя. У них есть всякие кумулятивные пакеты «Roll-up Package», но они включают обновления по определённой тематике, или заменяют собой другие. Весь набор исправлений одним файлом у MS будеть называться Service Pack 2 :)
А так — погуглите «windows 7 sp1 update pack», найдётся много всякого, может и то, что Вам подойдёт, есть.
Вопрос в доверии — готовы ли Вы ставить что-то с «левых» сайтов.
Вопрос: Почему появляется ошибка при сборке проекта?

Лучший ответ:
Ты используешь Spread-оператор(...) который не входит в es2015, а будет в 2016 или как-то так...
тебе нужен пресет : stage-0

Худший ответ:
в дополнении к предыдущему ответу, выглядит это примерно так:.babelrc"presets": ["es2015", "stage-0", "react"],
Вопрос: В чем причина долгого входа в Windows 7 у пользователей?

Лучший ответ:
Скорее всего из-за групповых политик. Смотрите системный лог.

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

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

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

Лучший ответ:
Почему "не присваиваем", второй код абсолютный эквивалент первого, только функция анонимная, это все равно что сравнитьvar m = 5;
return m;
иreturn 5;
Ровно одно и то же.

Худший ответ:
inc1() и inc2() совершенно две разные функции но это и так понятноfunction inc2() {
 var count = 1; // Объявляем count переменную и она сохраняется в скопе со значением 1 функции inc2()
  function inc() {
    return count++; // переменной count еще пока нет, и интропритатор начинает ее искать выше в функции         inc2() и сохраняет ее в свой скоп.
  };
 return inc; // возвращает полученое значение, при последующех вызовах, переменная будет увиличевотся на 1, поскольку у функции inc() в скопе она будет менять, а у функции inc2() как раз таки и проиходи сохранение через замыкание
}
В общем как то так )))) Если что то не правильно написал, поправьте
Вопрос: Youtube: Принудительная перезагрузка страницы. Есть решение?

Лучший ответ:
При нажатии на указанную вами кнопку происходит запрос по  https . А поскольку вы сидите через http вас приходится сначала за руку перевести куда надо. Чистый баг гугла. От вас не зависит

Худший ответ:
скачайте расширение https everywhere.
Вопрос: Одно из заданий школьной олимпиады по информатике. Как решить?

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

Худший ответ:
О! Самое простое решение, скорее всего самое неэффективное!
Есть двумерный массив поля 1000х1000, заполненный нулями.
Есть Х прямоугольников
Делаем цикл по прямоугольникам
Берем первый и ЗАКРАШИВАЕМ ВСЕ ЕГО ТОЧКИ, делая +=1 в нашем массиве
Берем следующий прямоугольник и повторяем предыдущее
Результат: сканируем все точки нашего массива и выводим те, у которых точка равна Х
Done.
Ну а как это записать на яве, попробуйте сами.
Оптимизировать можно, для этого точки  прямоугольников нужно логически складывать (конъюкция, если не ошибаюсь) каждый с последующим, результатом следующего должно быть разультатом сложения.  Другими словами, результатом сложения двух прямоугольников является прямоугольник их пересечения. На следующем цикле берем этот результат и следующий прямоугольник, результат используем на следующем. 
Можно вообще ничего не рисовать в координатном массиве! Быстро и очень эффективно, всего 4 операции на каждый прямоугольник.
Вопрос: Как быть с CSS-препроцессором в большом проекте?

Лучший ответ:
Скажите, положа руку на сердце, какой профит проекту от всего этого препроцессора? Какой профит разработчикам? Как чувствуют себя юзеры редакторов/иде, в которых не поддерживается синтаксис препроцессоров? Используется ли в проекте принцип АНБ? Как этому помогают миксины (именно АНБ, а не скруглённым углам)?

Худший ответ:
xml файл перечисляющий модули с source и lib внути. Source минифаится до файла модуля. Lib по отдельности. На dev отдается как есть, на prod файл модуля + lib. Эта же xml является управлялкой для минифаеров.
Можно доработать напильником до нескольких уровней.
Вопрос: Какая самая лучшая библиоткета для реализации ролей с привилегиями?

Лучший ответ:
вот отличная статья, тут и сравнения и админки для них.
https://laravel-news.com/two-best-roles-permission...

Худший ответ:
Проще будет самому написать велосипед
Вопрос: Зачем нужны сессии?

Лучший ответ:
У сессий только одно назначение - шаринг данных между запросами и различными компонентами. 
Куки для этого не годятся по нескольким причинам:
1 и главная - куки будут доступны только после перезагрузки страницы.
2 ненужный трафик. это не смертельно, но только пока проект только для хомяков. 
3 не секурно. можно конечно шифровать, но зачем?
4 куки не резиновые, у них есть лимит.

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

Лучший ответ:
Вообще это не такая простая задача. Есть множество алгоритмов кэширования.
Можно посмотреть в сторону LRU  от Джейка Вортона

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

Лучший ответ:
как вариант https://bamb.ninja/ на хабре даже была статья от разработчика

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

Лучший ответ:
Если речь про графический вход, то rdp/vnc/etc на это не ругается. Отрисовывалась очень красивая перспектива.

Тут правда не очень удачно окошки расположили, но дальше искать лениво.
А если про консольный (ssh какой-нибудь), то там такой красоты, конечно, нет. Но войти так тоже можно (:

Худший ответ:
Вы создадите воронку, которая под действием черной дыры во Вселенной, схлопнется
Вопрос: Как оптимизировать svg-файл, в котором находится 5 000 точек, для встраивания на страницу?

Лучший ответ:
1. Растеризовать SVG в обычную картинку. Вынести все данные в отдельный объект с картой. Слушать mouseover обычным VanillaJS. 
2. Оптимизировать SVG.
Из этого <circle class="tc-map-seat tc-map-seat_cat0" cx="201038" cy="16629" r="695" tc-seat-no="3"></circle>
Вот в это<circle class="c0" cx="201038" cy="16629" r="695" n="3"></circle>
Забыть нахрен про jQuery, зумить через CSS, двигать через VanillaJS requestAnimationFrame.
С сервера загружать с gzip. 
3. Посмотрите, как это сделано на ticketmaster.com. Там карта разбита на зоны. Можно сделать точно также, но по клику по зоне показывать карту зоны. Т.е. сделать 2 уровня зума. Просто и функционально, плюс можно подсвечивать занятые места.

Худший ответ:
Браузеру тяжеловато отрисовываеть такое количество элементов.
Canvas вместо SVG не рассматривали?
Вопрос: Почему Zabbix 3.0 не передаёт параметры $1,$2,$3 в скрипт?

Лучший ответ:

Проблема решена! Проблема была в том, что скрипт я запускал из под баша и соответственно параметры от Zabbix он не получал (т.к. использовал стандартным потоком ввода/вывода bash). Для работоспособности нужно было инициировать выполнение скрипта Zabbix'ом или добавить переменные при выполнении скрипта в баше. Для Zabbix 3.0 просот было необходимо добавить значения {ALERT.SENDTO}, {ALERT.SUBJECT}, {ALERT.MESSAGE} в Media Types к вашему скрипту.

Худший ответ:
Используй ${1} вместо $1
Вопрос: Стоит ли использовать Lua в качестве бэкенда для разработки браузерных игр?

Лучший ответ:
Опасно, могут быть подводные камни, как и в любой оригинальной технологии. Можно упереться в узкое место, в отсутствие нужной библиотеки, в отсутствие разработчиков на сопровождение, в непонятные баги. Чем реже и оригинальнее технология, тем меньше помощи может предолжить интернет. Если это проект, ориентированный на прибыль, а не на саморазвитие, я бы не рискнул.

Худший ответ:
Lua намного быстрее Python и требует меньше памяти. В остальном Python лучше.
Пишу на Lua игру — пока всё устраивает.
Вопрос: Минимальный набор элементов для отправки письма с сайта?

Лучший ответ:
Лучше подцепить любое готовое решение, например swiftmailer.
Он решает множество проблем с кодировкой, вложениями итд итп + умеет слать через smtp что весьма правильно.

Худший ответ:
Спасибо за ответы! Просто ситуация такая, что писем в месяц ну очень немного (около 20) и отлично все работало через mandrill, пока он платным не стал. Там вообще через js кинул запрос их api и все.