Красота игры Firewatch

Приобрел Firewatch, делюсь оставшимся от прохождения Приятным Теплым Чувством. Несколько важных положительных качеств игры:

  • Короткая (около шести часов).
  • Спокойная (никаких квиктайм ивентов, в любой момент можно задержаться, чтобы полюбоваться пейзажем или почитать записи).
  • Сюжет местами пугающий и тревожный (при этом без джамп-скейров), раскрывается через остроумную систему диалогов по рации.

Сэл-шэйдинговая красота:

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

Анимация play/pause

В прошлом году было модно анимировать переход икноки-гамбургера в крестик и обратно. В этом году вслед за ютубом все стали анимировать кнопку play/pause. Естественно, я тоже.

(Я начал использовать SASS и очень быстро стал большим фанатом препроцессоров.)

Музыку можно слушать как угодно

В 128 или 320 килобитах в секунду, в эм-пэ-три или лосслесс, через хорошие динамики или плохие наушники. С коллекционного издания альбома или с трижды пережатой пиратской копии. Волноваться о качестве проводов и всяком high fidelity можно — но зачем.

На пути до мозга звук проходит через несколько медиумов. Записывающее оборудование в студии записывает не совсем то, что играют музыканты. После сведения может получиться совсем не то. Усилители и микрофоны на концерте внесут свои коррективы. Акустика помещения сыграет свою роль. Барабанная перепонка разных людей по-разному отреагирует на одни и те же частоты — и с этим ничего не поделать. В слуховом нерве двух разных людей возникнут два разных сигнала, в мозге возникнут неодинаковые эмоции.

Нет «каноничной» версии трека: ценен не звук сам по себе, а чувства, которые он вызывает. Этим и прекрасна музыка. И если вы не можете получить удовольствие от музыки без флака и золотых проводов — ха-ха, а я могу.

Пользуясь случаем, рекламирую ЦАП и усилитель для наушников: FiiO Olympus 2. Отличная штука, сам пользуюсь.

В поисках свободных акронимов

Люди любят акронимы. В словаре STANDS4 Abbreviations больше 140 тысяч записей — целая куча сокращений! Интересно проверить, остались ли еще короткие акронимы, которые ничего не обозначают и никак не расшифровываются. Я узнал: остались, но мало.

Для начала нужен словарь акронимов. Мне понравился STANDS4 Abbreviations. Скрипт для PhantomJS прошелся по его буквенному указателю и составил полный список терминов. Я сразу удалил из терминов пробельные символы и точки: акронимы вроде F.M.H. (Farari Media House) превратились в FMH. Перебирал акронимы только из латинских букв (для простоты и поскольку словарь англоязычный). Интересны только не слишком длинные акронимы, поэтому я остановился на пяти буквах.

Результаты таблицей:

Возможных В словаре Свободных
Однобуквенных 26 26 0
Двух- 676 673 3 0,44%
Трех- 17 576 16 236 1 340 7,62%
Четырех- 456 976 72 879 384 097 84,05%
Пяти- 11 881 376 22 404 11 858 974 99,81%

Остались ли незанятые однобуквенные акронимы? Как и следовало ожидать, нет. А двухбуквенные? Удивительно, но да! Три экзотических сочетания: YQ, YX, ZX — пока никак не расшифровываются, по меньшей мере, наш словарь про них ничего знает. А трехбуквенные? Кажется, что трехбуквенных свободно много: 1 340 акронимов еще ждут своей расшифровки. Интереснее, что почти все трехбуквенные акронимы на самом деле заняты: 16 236 из 17 576 возможных акронимов уже имеют значения (больше 92%).

Полный список свободных трехбуквенных акронимов

XEA XJA XOA HQA GXA HXA JXA MXA NXA XXA YXA ZYA JZA KZA ZZA XEB BJB XJB ZLB XNB XPB GQB KQB LQB GVB EXB GXB HXB JXB XXB YXB ZXB EYB JYB XYB ZYB FZB GZB IZB JZB ZZB GJC ZJC XNC GQC JQC KQC XUC XVC HXC JXC KXC XXC ZYC CZC EZC HZC JZC XZC ZZC GJD XJD YJD ZJD ZKD ZOD FQD JQD KQD XQD ZQD GXD JXD KXD XXD ZXD JYD ZYD EZD FZD IZD JZD UZD XZD YZD ZAE ZDE XEE ZFE XGE ZGE XHE YIE HJE JJE KJE LJE ZJE HKE XKE KQE XQE ZQE XUE YVE ZWE GXE HXE JXE ZXE JYE ZYE DZE GZE JZE KZE LZE XZE ZHF FJF GJF HJF LJF NJF XJF ZJF XKF DQF GQF JQF KQF XQF ZQF ZRF ZUF KVF BXF FXF HXF IXF JXF XXF ZXF DZF GZF HZF IZF JZF LZF XZF EHG XHG ZHG CJG FJG HJG IJG KJG XJG FKG XKG BQG FQG GQG IQG JQG QQG XQG ZQG YUG AXG DXG FXG HXG KXG XXG ZXG GYG ZYG CZG EZG FZG GZG IZG JZG LZG UZG XZG XDH YEH ZEH OGH ZGH XHH XIH FJH GJH XJH YJH FKH HKH IKH LKH YKH ZKH XNH XOH ZOH XPH CQH DQH EQH FQH GQH IQH LQH NQH XQH ZQH XRH YRH FUH XUH GVH JVH KVH XVH ZVH XWH ZWH AXH DXH FXH GXH JXH KXH LXH NXH GYH JYH XYH DZH FZH GZH HZH IZH JZH XZH XGI ZII GJI HJI IJI LJI XJI ZJI XPI BQI GQI JQI KQI XQI ZVI FXI HXI JXI KXI NXI ZXI EYI IYI PYI XYI ZYI HZI IZI JZI XZI YZI ZZI XAJ DBJ KBJ XCJ ZCJ DDJ IDJ JDJ FEJ WEJ ZEJ GFJ HFJ HGJ IGJ LGJ OGJ QGJ WGJ XGJ ZGJ FHJ IHJ LHJ YHJ ZHJ ZIJ EJJ GJJ HJJ IJJ KJJ LJJ XJJ YJJ ZJJ CKJ EKJ GKJ QKJ ZKJ ZLJ GNJ HNJ LNJ ZNJ XOJ FPJ BQJ CQJ DQJ EQJ FQJ GQJ HQJ IQJ JQJ LQJ QQJ VQJ YQJ ZQJ DSJ GSJ HTJ EUJ EVJ FVJ NVJ XVJ YVJ EWJ GWJ QWJ ZWJ BXJ DXJ EXJ GXJ HXJ JXJ KXJ LXJ NXJ OXJ ZXJ DYJ EYJ FYJ GYJ HYJ IYJ KYJ LYJ UYJ WYJ XYJ ZYJ AZJ BZJ DZJ FZJ GZJ HZJ IZJ JZJ KZJ LZJ OZJ QZJ XZJ YZJ ZZJ XBK VEK XEK ZEK ZFK HGK VHK XHK ZHK ZIK GJK HJK XJK ZKK YLK ZLK ZNK AQK DQK EQK FQK GQK HQK IQK JQK KQK OQK VQK XRK XSK XTK YTK ZTK OUK ZUK FVK YVK FWK ZWK CXK DXK EXK FXK GXK HXK JXK NXK OXK PXK QXK RXK XXK ZXK GYK HYK JYK PYK YYK ZYK DZK EZK FZK GZK IZK LZK YZK FJL HJL IJL KJL YJL ZJL XKL ZML XNL ZNL JQL ZQL EXL JXL ZXL JYL FZL LZL ZZL YEM KJM XJM HKM ZLM JQM KQM FVM ZVM JXM KXM XXM YXM ZXM JYM DZM FZM XZM ZGN XHN FJN GJN XJN ZKN JMN ZMN XON XPN DQN FQN GQN HQN JQN KQN XQN XTN XUN FVN FWN XWN GXN HXN ZXN EYN IYN KYN ZYN GZN IZN JZN LZN QZN XZN ZDO XEO FJO GJO HJO KJO LJO ZKO XMO XNO EQO FQO GQO IQO JQO KQO RQO YQO ZQO XRO HUO XUO YUO DXO GXO HXO KXO MXO YXO ZXO EYO FYO GYO XYO YYO JZO XZO YZO ZZO XEP XHP HJP ZJP XNP ZNP YQP ZQP DXP HXP JXP ZXP ZYP DZP EZP GZP IZP KZP LZP RZP XZP ZZP XAQ FBQ FDQ IDQ LDQ XDQ ZDQ XEQ ZEQ XFQ EGQ FGQ GGQ HGQ OGQ XGQ IHQ LHQ XHQ YHQ EIQ GIQ XIQ ZIQ AJQ BJQ CJQ EJQ FJQ GJQ HJQ IJQ KJQ LJQ NJQ RJQ YJQ ZJQ CKQ DKQ GKQ HKQ IKQ KKQ NKQ ZKQ JLQ XLQ ZLQ GMQ JMQ ZMQ FNQ GNQ HNQ JNQ XNQ JOQ KOQ XOQ JPQ KPQ XPQ CQQ DQQ FQQ HQQ JQQ KQQ NQQ WQQ XQQ HRQ JRQ NRQ ZRQ JSQ HTQ XTQ EUQ IUQ JUQ XUQ BVQ EVQ FVQ GVQ HVQ KVQ AWQ CWQ EWQ GWQ HWQ KWQ LWQ XWQ AXQ DXQ EXQ FXQ HXQ JXQ LXQ XXQ YXQ ZXQ DYQ EYQ FYQ GYQ HYQ IYQ JYQ KYQ LYQ OYQ QYQ VYQ WYQ XYQ AZQ BZQ DZQ FZQ GZQ HZQ IZQ JZQ KZQ OZQ XZQ YZQ ZZQ XIR ZIR XJR YJR ZJR ZKR GQR KQR HUR XUR HXR JXR XXR ZXR JYR ZYR FZR HZR IZR JZR XZR ZZR EJS KJS XJS KQS XQS GXS JXS KXS ZXS IYS XYS YYS BZS DZS GZS HZS JZS MZS XZS ZZS ZET ZHT LJT ZJT XKT ZKT JQT ZQT ZWT FXT KXT ZXT DYT FZT XZT XBU ZBU ZEU XGU HHU XHU ZHU ZIU EJU FJU UJU FKU XKU ZLU XOU ZOU AQU DQU GQU IQU JQU KQU ZQU JRU XRU BUU YUU FVU XWU CXU DXU EXU FXU GXU KXU OXU ZXU GYU IYU OYU PYU QYU XYU ZYU EZU FZU GZU IZU JZU KZU OZU RZU XZU KBV XBV YDV XEV GGV XHV JIV ZIV DJV GJV HJV LJV RJV XJV ZJV FKV KKV YKV ZKV ZNV XOV ZOV AQV EQV FQV HQV IQV KQV XQV ZRV GVV KVV HWV YWV ZWV AXV CXV DXV EXV FXV GXV HXV KXV NXV WXV YXV ZXV AYV CYV DYV EYV GYV KYV OYV XYV AZV CZV DZV EZV FZV GZV IZV JZV KZV LZV OZV XZV XAW ZBW IHW YHW ZHW EJW FJW GJW HJW IJW KJW LJW FKW ZKW ZLW ZNW XOW ZOW DQW EQW FQW GQW HQW IQW JQW KQW XQW ZQW XRW ZRW ZTW KVW AXW BXW CXW DXW FXW GXW HXW JXW KXW LXW YXW GYW JYW ZYW AZW DZW FZW GZW HZW IZW KZW PZW QZW XBX HCX KCX XCX ZCX XDX ZDX YEX ZEX HGX IGX ZGX HHX KHX RHX XHX YHX ZHX LIX DJX EJX FJX GJX JJX KJX LJX NJX OJX XJX YJX FKX GKX HKX IKX LKX RKX ZKX JLX YLX ENX ZNX AOX EOX YOX BPX JPX KPX XPX AQX BQX CQX DQX FQX GQX IQX JQX KQX LQX OQX QQX RQX TQX VQX ZQX IRX YRX ZRX XSX ZSX FUX IUX KUX OUX XUX DVX FVX HVX XVX YVX DWX EWX HWX LWX YWX DXX FXX JXX KXX WXX ZXX DYX EYX FYX GYX IYX JYX NYX QYX VYX XYX YYX BZX DZX EZX FZX GZX HZX IZX JZX KZX LZX OZX WZX ZZX JAY XBY XCY ZCY VDY XDY YDY ZDY EEY JEY LEY OEY QEY WEY XEY ZEY DFY XFY ZFY JGY RGY XGY EHY KHY LHY OHY XHY JIY LIY OIY ZIY BJY CJY EJY FJY GJY HJY IJY KJY LJY OJY XJY YJY ZJY ZKY ZLY GMY QMY YMY KNY XNY ZNY OOY XOY ZOY RPY XPY AQY BQY CQY DQY GQY HQY JQY KQY LQY XQY ZQY IRY XSY ZSY ETY HTY XTY ZTY EUY FUY JUY OUY XUY DVY FVY LVY OVY XVY YVY XWY AXY BXY DXY EXY HXY JXY KXY LXY UXY VXY ZXY CYY DYY FYY JYY KYY LYY VYY ZYY EZY GZY HZY IZY JZY KZY LZY OZY XZY YZY ZZY EAZ EBZ FBZ HBZ LBZ XBZ DCZ HCZ QCZ UCZ XCZ FDZ HDZ IEZ KEZ OEZ VEZ XEZ ZEZ DFZ EFZ FFZ GFZ JFZ LFZ XFZ YFZ ZFZ EGZ JGZ ZGZ DHZ XHZ EIZ HIZ JIZ YIZ CJZ DJZ EJZ FJZ GJZ HJZ JJZ KJZ LJZ NJZ OJZ XJZ YJZ ZJZ AKZ DKZ FKZ GKZ HKZ IKZ RKZ VKZ ZKZ FLZ JLZ LLZ QLZ YLZ EMZ JMZ YMZ FNZ XNZ HOZ JOZ XOZ YOZ ZOZ BPZ DPZ JPZ OPZ BQZ CQZ EQZ FQZ GQZ HQZ IQZ JQZ KQZ LQZ MQZ UQZ DRZ IRZ JRZ VRZ XRZ YRZ HSZ ISZ ITZ JTZ XTZ DUZ EUZ FUZ IUZ RUZ YUZ DVZ FVZ GVZ KVZ XVZ BWZ FWZ LWZ OWZ YWZ ZWZ DXZ EXZ FXZ GXZ HXZ JXZ KXZ LXZ PXZ WXZ XXZ ZXZ BYZ DYZ EYZ FYZ GYZ HYZ IYZ JYZ OYZ RYZ VYZ CZZ GZZ HZZ KZZ LZZ MZZ VZZ XZZ YZZ

Гораздо больше выбор незанятых четырехбуквенных и пятибуквенных акронимов. Только 72 879 из 456 976 возможных четырехбуквенных (16%) и 22 404 из 11 881 376 возможных пятибуквенных акронимов (меньше двух десятых процента) имеют расшифровку.

Пепси-ко против Кока-кола Компани

Пепси обладает фатальным недостатком: Пепси-кола — ужасный напиток по сравнению с божественной Кока-колой. Не могу сказать точно, в чем там дело, но Кока-кола — это да, а Пепси-кола — это буээ. Даже Пепси-макс.

Этот недостаток заставлял многих¹ считать, что продукция Пепси-ко — отстой по сравнению с аналогами Кока-кола Компани. Поэтому многие² предпочитали пить Спрайт вместо Севен-апа, Фанту вместо Миринды и Пауэрейд вместо Гаторейда. Есть подозрение, что несколько лет назад кокакольные напитки действительно были круче пепсивых. Например, в моем детстве Миринда была редкостно ядовитым напитком, после которого язык становился оранжевым.

Недавно я случайно обнаружил, что Севен-ап — чудесный напиток с интересным вкусом, и Спрайт по сравнению с ним — просто сладкая вода. Я попробовал Миринду, и она оказалась более апельсиновой и менее сладкой, чем Фанта! Маунтин дью вообще легендарен и не имеет аналогов со стороны Кока-колы.

Вывод: пейте Кока-колу, а все остальное — от Пепси.

Удаление папки node_modules: source path too long

Менеджер пакетов npm не уплощает дерево зависимостей, поэтому часто создает пути невероятной вложенности. Вот, например, больше 260 символов:

D:\my-project\node_modules\grunt-divshot\node_modules\superstatic\node_modules\broker\node_modules\deliver\node_modules\join-path\node_modules\as-array\node_modules\lodash.values\node_modules\lodash.keys\node_modules\lodash._shimkeys\node_modules\lodash._objecttypes

Файловая система NTFS поддерживает пути даже длиннее 32 тысяч символов, но у Win32 возникают проблемы при работе с путями длиннее 260 символов. Например, при попытке удалить директорию node_modules возникнет ошибка:

Самый простой способ все-таки удалить папку со слишком глубокой вложенностью — установить rimraf и воспользоваться его интерфейсом командной строки:

npm install rimraf -g
rimraf node_modules

На самом деле, удивительно, что стандартный проводник фейлится по сравнению с утилитой для Node.js.

Почему я не соглашаюсь «покидать музыку»

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

Лучше обсуждайте книги и фильмы, которые работают на рациональном уровне. А музыка — очень личное дело.

Тизер нового проекта

Новый проект называется vǿịd, будет очень модным и откроется осенью.

Сортировка в музыкальных плеерах

Умная текстовая сортировка должна уметь игнорировать артикли a, an, the в начале строки. Это особенно важно для музыкальный плееров: иначе половина исполнителей, вроде The Beatles, The Kinks и The Who, окажется на букву „T“.

Сортировка по алфавиту — пуленепробиваемый вариант. Но стоит также подумать о сортировке исполнителей по частоте прослушивания, альбомов по году выпуска и так далее.

Сайт лечебно-диагностического центра «Медицина +»

Сделал сайт для лечебно-диагностического центра «Медицина +». Сайт рассказывает о главном: услугах и ценах.

Моя любимая фишка — «прозрачная» графика. Через иконки, границы и плашки на сайте просвечивает фоновый градиент, и эти элементы красиво переливаются от зеленого к фиолетовому при прокрутке страницы.

Сайт работает на Bolt CMS, форма записи интегрирована с гугл-документами.

Вертикальный ритм и врезки

Верстать хорошо так, чтобы расстояния между строками были кратны одну и тому же базовому значению. Это называется вертикальным ритмом.

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

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

Но иногда все-таки приходится вставить на полосу врезку с высотой строки, не кратной базовой. Как тогда сохранить вертикальный ритм? В этой книге общую высоту врезки «добивают» до кратной базовой за счет дополнительных отсупов до и после. Обратите внимание на различный размер отступов у врезок на этом развороте:

Таким образом и в этой ситуации вертикальный ритм удается сохранить. Отличный прием!

Крутость jspm

Эту версию сайта я делал, используя пакетный менеджер для яваскриптового фронтэнда jspm — и мне понравилось. Вот почему.

Обычно для получения фронтэндовых пакетов используют Bower. Для удобного использования Bower-пакетов с загрузчиком модулей приходится использовать заклинания вроде grunt-bower-requirejs, чтобы конфиг с путями к модулям для RequireJS создавался автоматически.

В отличие от Bower, который фактически умеет только скачивать пакеты, jspm изначально создавался с расчетом на использование загручика модулей SystemJS. При инициализации проекта SystemJS скачивается автоматически, а при установке пакетов они сразу прописываются в конфиг. Пакеты устанавливаются с гитхаба и из npm, плюс ведется модерируемый реестр. Как бонус, появляется возможность использовать ES6.

jspm умеет собирать код в один файл. Делаем jspm bundle-sfx — и получаем единственный файл для использования на продакшене вообще без загрузчика модулей, только, почему-то, не минифицированный.

Таким образом, четыре инструмента (Bower, RequireJS, RequireJS Optimizer и grunt-bower-requirejs) заменены одним jspm. Мне не хватает только встроенной склейки и минификации CSS (как в оптимизаторе RequireJS), тогда Grunt стал бы совсем не нужен. Но пока без сборщика не обойтись.

Бонус: Gruntfile для типичного проекта с jspm

Задача:

  • собрать яваскрипт в один минифицированный файл,
  • минифицировать CSS, выполнить подстановки @import,
  • подготовить папку с готовыми для публикации файлами проекта.

Решение: вот такой Gruntfile.

Структура проекта:

  • Весь код в папке js/,
  • основной модуль проекта называется js/main,
  • все стили в папке css/,
  • файл index.html выглядит так:
<html>
<head>
	<meta charset="UTF-8">
	<title>My Super App</title>
	<link rel="stylesheet" href="css/site.css">
</head>
<body>
	...

	<!-- Код ниже — стандартный при использовании jspm:
	подключаем загрузчик и конфиг, загружаем основной модуль: -->

	<!-- build:script js/site.js -->
	<script src="jspm_packages/system.js"></script>
	<script src="config.js"></script>
	<script>
		System.import('js/main');
	</script>
	<!-- /build -->
</body>
</html>

Gruntfile первым делом выполняет команду jspm bundle-sfx js/main build/js/site.js в командной строке. jspm анализирует зависимости модулей друг от друга и создает файл site.js в подпапке build/, содержащий объединенный код всех используемых модулей в правильном порядке.

Теперь было бы здорово автоматически заменять в HTML-файлах все теги <script> на единственный тег с подключением минифицированного файла site.js. Хорошо, что для этого придумали плагин grunt-processhtml! Если окружить теги <script> специальными комментариями (как мы и сделали в файле index.html):

<!-- build:script js/site.js -->
<script src="jspm_packages/system.js"></script>
<script src="config.js"></script>
<script>
	System.import('js/main');
</script>
<!-- /build -->

то плагин выполнит замену:

<script src="js/site.js"></script>

Более того, если добавить к спецкомментариям слово inline, то скрипт или таблица стилей будет встроена прямо в файл — еще меньше запросов к серверу! C такими поправками файл станет полностью самодостаточным:

<html>
<head>
	<meta charset="UTF-8">
	<title>My Super App</title>
	<!-- build:css inline -->
	<link rel="stylesheet" href="css/site.css">
	<!-- /build -->	
</head>
<body>
	...

	<!-- build:script inline js/site.js -->
	<script src="jspm_packages/system.js"></script>
	<script src="config.js"></script>
	<script>
		System.import('js/main');
	</script>
	<!-- /build -->
</body>
</html>

Такой воркфлоу я использую для публикации этого сайта.

Игги Поп на BBC Radio 6 Music

Игги Поп ведет очень годный музыкальный эфир на BBC Radio 6 Music. Официально слушать эфиры в записи можно только через BBC iPlayer, что не всегда удобно. Я сделал сайт, куда выкладываются записи эфиров и трек-листы:

Технологии: Backbone, RequireJS, Mustache, иконочный шрифт (использую IcoMoon App, крутой инструмент), HTML5 Audio (написал клевую обертку над стандартным HTMLMediaElement, расскажу в следующий раз).

Проект поддерживается моими силами, новые эпизоды могут появляться с задержкой.

Irn Bru

Попробовал напиток, постоянно попадавшийся на глаза, но который до этого ни разу не покупал: Irn-Bru — второй по известности шотландский напиток после скотча. Необычно, и grows on you. Вот еще напиток с названием из двух слов по три буквы: Mnt Dew.

Загрузка твитов яваскриптом без авторизации и смс

Текущий REST API Твиттера требует обязательной авторизации. Это неудобно и глупо, например, для чтения твитов из открытого аккаунта авторизация явно лишняя.

Зато при использовании виджетов авторизация не требуется, что дает возможность получить последние твиты пользователя (не более 20) чисто клиентским яваскриптом. Идея в том, чтобы загрузить виджет в скрытый контейнер на странице, а потом распарсить его содержание. Моя небольшая библиотека это и делает, использовать ее можно так:

loadTweets('123456789012345678', 10).done(function(tweets) {
	console.log(tweets);
});

Здесь первый параметр — ID виджета, созданного в настройках профиля, второй параметр — количество твитов для загрузки. Все работает асинхронно и возвращает jQuery Deferred, который разрешается массивом твитов.

Код, оформленный в виде модуля RequireJS, и крошечная документация доступны в репозитории на битбакете.