{"action":"created","comment":{"url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/comments/41102031","id":41102031,"diff_hunk":"@@ -1,3 +1,420 @@\n+<!DOCTYPE html>\n <html>\n-    <!-- Ваш замечательный код -->\n+\t<head lang=\"ru\">\n+\t\t<meta charset=\"utf-8\">\n+        <title>Яндекс.Блог</title>\n+        <style type=\"text/css\">\n+        \tbody {\n+        \t\twidth: 80%;\n+        \t\tmargin-right: 10%;\n+        \t\tmargin-left: 10%;\n+        \t\tfont-size: 125%;\n+        \t}\n+        \theader.mainHeader {\n+        \t\ttext-align: center;\n+        \t\tcolor: red;\n+        \t}\n+        \tp.algorithm {\n+        \t\tbackground-color: #e3e0de;\n+        \t\tpadding: 10px;\n+        \t}\n+        \tarticle.comment {\n+        \t\tbackground-color: #d7f3f7;\n+        \t\tmargin: 5px;\n+        \t\tpadding: 10px;\n+        \t}\n+        \tfooter {\n+        \t\ttext-align: right;\n+        \t}\n+        \ttable {\n+        \t\tborder: 3px solid black;\n+        \t\twidth: 50%;\n+        \t\tmargin-right: 25%;\n+        \t\tmargin-left: 25%;\n+        \t\tborder-collapse: collapse;\n+        \t}\n+        \tthead {\n+        \t\tbackground-color: #e3e0de;\n+        \t}\n+        \ttr, th {\n+        \t\tborder: 3px solid black;\n+        \t}\n+        </style>\n+\t</head>\n+\t<body>\n+\t\t<header class=\"mainHeader\">\n+\t\t\t<h1> Блог компании Яндекс. </h1>\t\t\t\n+\t\t</header>\n+\t\t<section>\n+\t\t\t<header>\n+\t\t\t\t<h2> ЯНДЕКС.ПОЧТА: КАК МЫ ИЗМЕРЯЕМ СКОРОСТЬ ЗАГРУЗКИ И УЛУЧШАЕМ ЕЁ </h2>\n+\t\t\t</header>\n+\t\t\t<article>\t\t\t\t\n+\t\t\t\t<p> \n+\t\t\t\t\tЕсли ваш сайт медленно грузится, вы рискуете тем, что люди не оценят ни то,\n+\t\t\t\t\tкакой он красивый, ни то, какой он удобный. Никому не понравится, когда все\n+\t\t\t\t\tтормозит. Мы регулярно добавляем в Яндекс.Почту новую функциональность,\n+\t\t\t\t\tиногда — исправляем ошибки, а это значит, у нас постоянно появляются новый код\n+\t\t\t\t\tи новая логика. Всё это напрямую влияет на скорость работы интерфейса.\n+\t\t\t\t</p>\n+\t\t\t\t<h3>Что мы измеряем</h3>\n+\t\t\t\t<ul> <strong> Этапы первой загрузки: </strong>\n+\t\t\t\t\t<li> подготовка; </li>\n+\t\t\t\t\t<li> загрузка статики (HTTP-запрос и парсинг); </li>\n+\t\t\t\t\t<li> исполнение модулей; </li>\n+\t\t\t\t\t<li> инициализация базовых объектов; </li>\n+\t\t\t\t\t<li> отрисовка. </li>\n+\t\t\t\t</ul>\n+\t\t\t\t<ul> <strong> Этапы отрисовки любой страницы: </strong>\n+\t\t\t\t\t<li> подготовка к запросу на сервер; </li>\n+\t\t\t\t\t<li> запрос данных с сервера; </li>\n+\t\t\t\t\t<li> шаблонизация; </li>\n+\t\t\t\t\t<li> обновление DOM. </li>\n+\t\t\t\t</ul>\n+\t\t\t\t<blockquote>\n+\t\t\t\t\t<p> \n+\t\t\t\t\t\t&ndash; <q>Ок, теперь у нас есть метрики, мы можем отправить их на сервер</q> \n+\t\t\t\t\t\t&ndash; говорим мы\n+\t\t\t\t\t</p>\n+\t\t\t\t\t<p> &ndash; <q>Что же дальше?</q> &ndash; вопрошаете вы </p>\n+\t\t\t\t\t<p> &ndash; <q>А давай построим график!</q> &ndash; отвечаем мы </p>\n+\t\t\t\t\t<p> &ndash; <q>А что будем считать?</q> &ndash; уточняете вы </p>\n+\t\t\t\t</blockquote>\n+\t\t\t\t<p> \n+\t\t\t\t\tКак вы знаете, <dfn> медиана – это серединное, а не среднее значение в выборке. </dfn>\n+\t\t\t\t\tЕсли у нас имеются числа 1, 2, 2, 3, 8, 10, 20, то медиана – 3, а среднее – 6,5.\n+\t\t\t\t\tВ общем случае медиана отлично показывает, сколько грузится средний пользователь.\n+\t\t\t\t</p>\n+\t\t\t\t<p>\n+\t\t\t\t\tВ случае ускорения или замедления медиана, конечно, изменится. Но она не может\n+\t\t\t\t\tрассказать, сколько пользователей ускорилось, а сколько замедлилось.\n+\t\t\t\t</p>\n+\t\t\t\t<p>\n+\t\t\t\t\t<cite> \n+\t\t\t\t\t\t<a href=\"https://en.wikipedia.org/wiki/Apdex\">\n+\t\t\t\t\t\t\t<abbr title=\"Application Performance Index\"> APDEX </abbr> \n+\t\t\t\t\t\t</a> \n+\t\t\t\t\t</cite> \n+\t\t\t\t\t– метрика, которая сразу говорит: хорошо или плохо. \n+\t\t\t\t\tМетрика работает очень просто. Мы выбираем временной интервал <var> [0; t] </var>, \n+\t\t\t\t\tтакой, что если время показа страницы попало в него, то пользователь счастлив. \n+\t\t\t\t\tБерем еще один интервал, <var> (t; 4t] </var> (в четыре раза больше первого), и считаем, \n+\t\t\t\t\tчто если страница показана за это время, то пользователь в целом удовлетворен скоростью \n+\t\t\t\t\tработы,\tно уже не настолько счастлив. И применяем формулу:\t\n+\t\t\t\t</p>\n+\t\t\t\t<p> \n+\t\t\t\t\t<blockquote> \n+\t\t\t\t\t\t(кол-во счастливых пользователей + кол-во удовлетворенных / 2) / (кол-во всех). \n+\t\t\t\t\t</blockquote> \n+\t\t\t\t<!-- <math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n+\t\t\t\t\t<mfrac>\n+\t\t\t\t\t\t<mrow>\n+\t\t\t\t\t\t\t<mi> кол-во счастливых пользователей </mi> \n+\t\t\t\t\t\t\t<mo> + </mo> \n+\t\t\t\t\t\t\t<mfrac>\n+\t\t\t\t\t\t\t\t<mrow> \n+\t\t\t\t\t\t\t\t\t<mi> кол-во удовлетворенных </mi>\n+\t\t\t\t\t\t\t\t</mrow>\n+\t\t\t\t\t\t\t\t<mrow> \n+\t\t\t\t\t\t\t\t\t<mn> 2 </mn>\n+\t\t\t\t\t\t\t\t</mrow>\n+\t\t\t\t\t\t\t</mfrac>\n+\t\t\t\t\t\t</mrow>\n+\t\t\t\t\t\t<mrow>\n+\t\t\t\t\t\t\t<mi> кол-во всех </mi>\n+\t\t\t\t\t\t</mrow>\n+\t\t\t\t\t</mfrac>\n+\t\t\t\t</math>  -->\n+\t\t\t\t</p>\n+\t\t\t\t<p>\n+\t\t\t\t\tПолучается значение от нуля до единицы, которое, видимо, лучше всего показывает,\n+\t\t\t\t\tхорошо или плохо работает почта.\n+\t\t\t\t</p>\n+\t\t\t</article>\n+\t\t\t<article>\n+\t\t\t\t<h3> Как мы измеряем </h3>\t\n+\t\t\t\t<p> \n+\t\t\t\t\tСейчас модуль обновления сам логирует все свои стадии, и можно легко понять\n+\t\t\t\t\tпричину замедления: медленнее стал отвечать сервер либо слишком долго\n+\t\t\t\t\tвыполняется JavaScript. Выглядит это примерно так:\n+\t\t\t\t</p>\n+\t\t\t\t<p>\n+\t\t\t\t\t<code> \n+\t\t\t\t\t\tthis.timings['look-ma-im-start'] = Date.now();\n+\t\t\t\t\t\t<br>\n+\t\t\t\t\t\tthis.timings['look-ma-finish'] = Date.now();\n+\t\t\t\t\t</code>\n+\t\t\t\t</p>\n+\t\t\t\t<p>\n+\t\t\t\t\tC помощью <code> Date.now() </code> мы получаем текущее время. \n+\t\t\t\t\tВсе тайминги собираются и при отправке рассчитываются. \n+\t\t\t\t\tНа этапах разница между <em> “end” </em> и <em> “start” </em> не считается, \n+\t\t\t\t\tа все вычисления производятся в конце:\n+\t\t\t\t</p>\n+\t\t\t\t<p>\n+\t\t\t\t\t<code> \n+\t\t\t\t\t\tvar totalTime = this.timings['look-ma-finish'] - this.timings['look-ma-im-start'];\n+\t\t\t\t\t</code>\n+\t\t\t\t</p>\n+\t\t\t\t<p> И на сервер прилетают подобные записи: </p>\n+\t\t\t\t<p> <var> serverResponse </var> = 50&&amp; <var> domUpdate </var>=60 </p>\n+\t\t\t</article>\n+\t\t\t<article>\n+\t\t\t\t<h3> Как мы ускоряем </h3>\t\t\t\t\n+\t\t\t\t<ul> \n+\t\t\t\t\t<string> \n+\t\t\t\t\t\tЧтобы снизить время загрузки почты при выходе новых версий, мы уже делаем следующее:\n+\t\t\t\t\t</string>\n+\t\t\t\t\t<li> включаем <abbr title=\"GNU Zip\"> gzip </abbr>; </li>\n+\t\t\t\t\t<li> выставляем заголовки кэширования; </li>\n+\t\t\t\t\t<li> фризим \n+\t\t\t\t\t\t<abbr title=\"Cascading Style Sheets\"> CSS </abbr>, \n+\t\t\t\t\t\t<abbr title=\"JavaScript\"> JS </abbr>, \n+\t\t\t\t\t\tшаблоны и картинки; </li>\n+\t\t\t\t\t<li> используем CDN; </li>\n+\t\t\t\t</ul>\n+\t\t\t\t<p> \n+\t\t\t\t\tМы подумали: <q> А что если хранить где-то старую версию файлов, а при выходе новой\n+\t\t\t\t\tпередавать только diff между ней и той, которая сохранена у пользователя? </q>\n+\t\t\t\t\tВ браузере же останется просто наложить патч на клиенте.\n+\t\t\t\t</p> \n+\t\t\t\t<p>\n+\t\t\t\t\tНа самое деле эта идея не нова. Уже существуют стандарты для HTTP — например,\n+\t\t\t\t\t<cite>\n+\t\t\t\t\t\t<a href=\"http://www.ietf.org/rfc/rfc3229\">RFC 3229 Delta encoding in HTTP</a>\n+\t\t\t\t\t</cite> \n+\t\t\t\t\tи \n+\t\t\t\t\t<cite>\n+\t\t\t\t\t\t<a href=\"http://lists.w3.org/Archives/Public/ietf-http-wg/2008JulSep/att-0441/\n+\t\t\t\t\t\tShared_Dictionary_Compression_over_HTTP.pdf\"> \n+\t\t\t\t\t\t\tGoogle SDHC\n+\t\t\t\t\t\t</a>\n+\t\t\t\t\t</cite>, — но по разным причинам они\n+\t\t\t\t\tне получили должного распространения в браузерах и на серверах.\n+\t\t\t\t</p>\t\n+\t\t\t\t<p>\n+\t\t\t\t\tМы же решили сделать свой аналог на <abbr title=\"JavaScript\"> JS </abbr>. \n+\t\t\t\t\tЧтобы реализовать этот метод обновления, начали искать реализации diff на \n+\t\t\t\t\t<abbr title=\"JavaScript\"> JS </abbr>. \n+\t\t\t\t\tНа популярных хостингах кода нашли библиотеки:\n+\t\t\t\t\t<ul>\n+\t\t\t\t\t\t<li style=\"list-style-type: none\"> &mdash; \n+\t\t\t\t\t\t\t<cite> \n+\t\t\t\t\t\t\t\t<a href=\"https://en.wikipedia.org/wiki/VCDIFF\"> VCDiff </a> \n+\t\t\t\t\t\t\t</cite>\n+\t\t\t\t\t\t</li>\n+\t\t\t\t\t\t<li style=\"list-style-type: none\"> &mdash; google-diff-patch-match </li>\n+\t\t\t\t\t</ul>\n+\t\t\t\t</p>\t\n+\t\t\t\t<p>\n+\t\t\t\t\tДля окончательного выбора библиотеки нам нужно сравнить:\n+\t\t\t\t</p>\t\n+\t\t\t\t<table>\n+\t\t\t\t\t<thead> \n+\t\t\t\t\t\t<tr>\n+\t\t\t\t\t\t\t<th> Библиотека </th>\n+\t\t\t\t\t\t\t<th> IE 9 </th>\n+\t\t\t\t\t\t\t<th> Opera 12 </th>\n+\t\t\t\t\t\t</tr>\n+\t\t\t\t\t</thead>\n+\t\t\t\t\t<tbody>\n+\t\t\t\t\t\t<tr>\n+\t\t\t\t\t\t\t<th> vcdiff </th>\n+\t\t\t\t\t\t\t<th> 8 </th>\n+\t\t\t\t\t\t\t<th> 5 </th>\n+\t\t\t\t\t\t</tr>\n+\t\t\t\t\t\t<tr>\n+\t\t\t\t\t\t\t<th> google diff </th>\n+\t\t\t\t\t\t\t<th> 1363 </th>\n+\t\t\t\t\t\t\t<th> 76 </th>\n+\t\t\t\t\t\t</tr>\n+\t\t\t\t\t</tbody>\n+\t\t\t\t</table>\n+\t\t\t\t<p>\n+\t\t\t\tПосле того как мы определились с библиотекой для диффа, нужно определиться с тем,\n+\t\t\t\tгде и как хранить статику на клиенте.\n+\t\t\t\t</p>\n+\t\t\t\t<p> Формат файла с патчами для проекта выглядит так:\n+\t\t\t\t\t<br>\n+\t\t\t\t\t<code> \n+\t\t\t\t\t\t[\n+\t\t\t\t\t\t    {\n+\t\t\t\t\t\t        \"k\": \"jane.css\",\n+\t\t\t\t\t\t        \"p\": [patch],\n+\t\t\t\t\t\t        \"s\": 4554\n+\t\t\t\t\t\t    },\n+\t\t\t\t\t\t    {\n+\t\t\t\t\t\t        \"k\": \"jane.css\",\n+\t\t\t\t\t\t        \"p\": [patch],\n+\t\t\t\t\t\t        \"s\": 4554\n+\t\t\t\t\t\t    }\n+\t\t\t\t\t\t]\n+\t\t\t\t\t</code>\n+\t\t\t\t</p>\n+\t\t\t\t<p> \n+\t\t\t\t\tТо есть это обычный массив из объектов. Каждый объект — отдельный ресурс. У\n+\t\t\t\t\tкаждого объекта есть три свойства. k — названия ключа в <var>localStorage</var> для этого\n+\t\t\t\t\tресурса. <var>p</var> — патч для ресурса, который сгенерировал <em>vcdiff</em>. \n+\t\t\t\t\t<var>s</var> — чексумма для ресурса актуальной версии, чтобы потом можно было проверить \n+\t\t\t\t\tправильность наложения патча на клиенте. Чексумма вычисляется по алгоритму \n+\t\t\t\t\t<a href=\"https://ru.wikipedia.org/wiki/Алгоритм_Бройдена_—_Флетчера_—_Гольдфарба_—_Шанно\"> \n+\t\t\t\t\tФлетчера </a>.\n+\t\t\t\t</p>\n+\t\t\t\t<p>\n+\t\t\t\t\tАлгоритм Бройдена — Флетчера — Гольдфарба — Шанно \n+\t\t\t\t\t(<abbr title=\"royden — Fletcher — Goldfarb — Shanno algorithm\"> BFGS </abbr>)\n+\t\t\t\t\t— итерационный метод численной оптимизации, предназначенный для\n+\t\t\t\t\tнахождения локального максимума/минимума нелинейного функционала\n+\t\t\t\t\tбез ограничений.\n+\t\t\t\t</p>\t\n+\t\t\t\t<p>\n+\t\t\t\t\t<strong> Алгоритм: </strong> <br>\n+\t\t\t\t\t<p class=\"algorithm\">\n+\t\t\t\t\tдано <strong> <em> &#x03B5; x<sub>0</sub> </strong> </em> <br>\n+\t\t\t\t\tинициализировать <strong> <em> &Eta;<sub>0</sub></strong> </em> <br>\n+\t\t\t\t\t<strong> <em> k = 0 </strong> </em> <br>\n+\t\t\t\t\t<strong> while </strong> ||<strong> <em> &nabla; &fnof;<sub>0</sub></strong> </em>|| \n+\t\t\t\t\t<br>\n+\t\t\t\t\t&#9; найти направление \n+\t\t\t\t\t\t<strong>\n+\t\t\t\t\t\t\t<em>p<sub>k</sub> = &ndash; C<sub>k</sub>&nabla;&fnof;<sub>k</sub></em>\n+\t\t\t\t\t\t</strong>\n+\t\t\t\t\t<br>\n+\t\t\t\t\t&#9; вычислить \n+\t\t\t\t\t\t<strong><em>\n+\t\t\t\t\t\t\tx<sub>k+1</sub> = x<sub>k</sub> + &#x03B1;<sub>k</sub>p<sub>k</sub>\n+\t\t\t\t\t\t</em></strong>\n+\t\t\t\t\t\t, \n+\t\t\t\t\t\t<strong>\n+\t\t\t\t\t\t\t<em> &#x03B1;<sub>k</sub> </em>\n+\t\t\t\t\t\t</strong> удовлетворяет условиям Вольфе\n+\t\t\t\t\t<br>\n+\t\t\t\t\t&#9; обозначить\n+\t\t\t\t\t\t<strong><em> \n+\t\t\t\t\t\t\ts<sub>k</sub> = x<sub>k+1</sub> &ndash; x<sub>k</sub> \n+\t\t\t\t\t\t</em></strong>\n+\t\t\t\t\t\tи \n+\t\t\t\t\t\t<strong><em> \n+\t\t\t\t\t\t\ty<sub>k</sub> = &nabla; &fnof;<sub>k+1</sub> &ndash; &nabla; &fnof;<sub>k</sub>\n+\t\t\t\t\t\t</em></strong>\n+\t\t\t\t\t<br>\n+\t\t\t\t\t&#9; вычислить \n+\t\t\t\t\t\t<strong> <em> C<sub>k+1</sub> </em> </strong>\n+\t\t\t\t\t<br>\n+\t\t\t\t\t&#9; <strong> <em> k = k + 1 </em> </strong>\n+\t\t\t\t\t<br>\n+\t\t\t\t\t<strong> end </strong>\n+\t\t\t\t\t</p>\n+\t\t\t\t</p>\n+\t\t\t\t<p>\n+\t\t\t\t\tПочему именно алгоритм Флетчера, а не другие популярные алгоритмы вроде:\n+\t\t\t\t\t<br>\n+\t\t\t\t\t<a href=\"https://ru.wikipedia.org/wiki/Циклический_избыточный_код \">\n+\t\t\t\t\t\t<abbr title=\"Cyclic redundancy check\"> CRC16/32 </abbr>\n+\t\t\t\t\t</a>\n+\t\t\t\t\t- алгоритм нахождения контрольной суммы, предназначенный для проверки\n+\t\t\t\t\tцелостности данных\n+\t\t\t\t\t<br>\n+\t\t\t\t\t<a href=\"https://ru.wikipedia.org/wiki/MD5\">\n+\t\t\t\t\t\t<abbr title=\"Message Digest 5\"> md5 </abbr>\n+\t\t\t\t\t</a>\n+\t\t\t\t\t- 128-битный алгоритм хеширования. Предназначен для создания «отпечатков»\n+\t\t\t\t\tили дайджестов сообщения произвольной длины и последующей проверки\n+\t\t\t\t\tих подлинности.\n+\t\t\t\t</p>\t\n+\t\t\t\t<p> Потому что он быстрый, компактный и легок в реализации. </p>\t\n+\t\t\t</article>\n+\t\t\t<article> \n+\t\t\t\t<h3> Итог </h3>\n+\t\t\t\t<p> Фактически мы экономим 80-90% трафика.  </p>\n+\t\t\t\t<table>\n+\t\t\t\t\t<caption> Размер загружаемой статитки в байтах: </caption>\n+\t\t\t\t\t<thead> \n+\t\t\t\t\t\t<tr>\n+\t\t\t\t\t\t\t<th> Релиз </th>\n+\t\t\t\t\t\t\t<th> С патчем </th>\n+\t\t\t\t\t\t\t<th> Без патча </th>\n+\t\t\t\t\t\t</tr>\n+\t\t\t\t\t</thead>\n+\t\t\t\t\t<tbody>\n+\t\t\t\t\t\t<tr>\n+\t\t\t\t\t\t\t<th> 7.7.20 </th>","path":"index.html","position":342,"original_position":342,"commit_id":"f2c37febd852b218b9a49bc528ad58f8ee1b7b10","original_commit_id":"f2c37febd852b218b9a49bc528ad58f8ee1b7b10","user":{"login":"bratva","id":1937870,"avatar_url":"https://avatars.githubusercontent.com/u/1937870?v=3","gravatar_id":"","url":"https://api.github.com/users/bratva","html_url":"https://github.com/bratva","followers_url":"https://api.github.com/users/bratva/followers","following_url":"https://api.github.com/users/bratva/following{/other_user}","gists_url":"https://api.github.com/users/bratva/gists{/gist_id}","starred_url":"https://api.github.com/users/bratva/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bratva/subscriptions","organizations_url":"https://api.github.com/users/bratva/orgs","repos_url":"https://api.github.com/users/bratva/repos","events_url":"https://api.github.com/users/bratva/events{/privacy}","received_events_url":"https://api.github.com/users/bratva/received_events","type":"User","site_admin":false},"body":"`th` - [для заголовков](http://htmlbook.ru/sites/search/?q=th&x=0&y=0), тут лучше `td`","created_at":"2015-10-04T20:30:08Z","updated_at":"2015-10-04T20:30:08Z","html_url":"https://github.com/urfu-2015/verstka-tasks-1/pull/59#discussion_r41102031","pull_request_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/59","_links":{"self":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/comments/41102031"},"html":{"href":"https://github.com/urfu-2015/verstka-tasks-1/pull/59#discussion_r41102031"},"pull_request":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/59"}}},"pull_request":{"url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/59","id":46707784,"html_url":"https://github.com/urfu-2015/verstka-tasks-1/pull/59","diff_url":"https://github.com/urfu-2015/verstka-tasks-1/pull/59.diff","patch_url":"https://github.com/urfu-2015/verstka-tasks-1/pull/59.patch","issue_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/issues/59","number":59,"state":"open","locked":false,"title":"Онуфриенко Екатерина","user":{"login":"onufrienko","id":14929766,"avatar_url":"https://avatars.githubusercontent.com/u/14929766?v=3","gravatar_id":"","url":"https://api.github.com/users/onufrienko","html_url":"https://github.com/onufrienko","followers_url":"https://api.github.com/users/onufrienko/followers","following_url":"https://api.github.com/users/onufrienko/following{/other_user}","gists_url":"https://api.github.com/users/onufrienko/gists{/gist_id}","starred_url":"https://api.github.com/users/onufrienko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/onufrienko/subscriptions","organizations_url":"https://api.github.com/users/onufrienko/orgs","repos_url":"https://api.github.com/users/onufrienko/repos","events_url":"https://api.github.com/users/onufrienko/events{/privacy}","received_events_url":"https://api.github.com/users/onufrienko/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-10-03T15:53:56Z","updated_at":"2015-10-04T20:30:08Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e5902250afd039389f43a497460a10ef2f81a15e","assignee":{"login":"bratva","id":1937870,"avatar_url":"https://avatars.githubusercontent.com/u/1937870?v=3","gravatar_id":"","url":"https://api.github.com/users/bratva","html_url":"https://github.com/bratva","followers_url":"https://api.github.com/users/bratva/followers","following_url":"https://api.github.com/users/bratva/following{/other_user}","gists_url":"https://api.github.com/users/bratva/gists{/gist_id}","starred_url":"https://api.github.com/users/bratva/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bratva/subscriptions","organizations_url":"https://api.github.com/users/bratva/orgs","repos_url":"https://api.github.com/users/bratva/repos","events_url":"https://api.github.com/users/bratva/events{/privacy}","received_events_url":"https://api.github.com/users/bratva/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/59/commits","review_comments_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/59/comments","review_comment_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/comments{/number}","comments_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/issues/59/comments","statuses_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/statuses/f2c37febd852b218b9a49bc528ad58f8ee1b7b10","head":{"label":"onufrienko:master","ref":"master","sha":"f2c37febd852b218b9a49bc528ad58f8ee1b7b10","user":{"login":"onufrienko","id":14929766,"avatar_url":"https://avatars.githubusercontent.com/u/14929766?v=3","gravatar_id":"","url":"https://api.github.com/users/onufrienko","html_url":"https://github.com/onufrienko","followers_url":"https://api.github.com/users/onufrienko/followers","following_url":"https://api.github.com/users/onufrienko/following{/other_user}","gists_url":"https://api.github.com/users/onufrienko/gists{/gist_id}","starred_url":"https://api.github.com/users/onufrienko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/onufrienko/subscriptions","organizations_url":"https://api.github.com/users/onufrienko/orgs","repos_url":"https://api.github.com/users/onufrienko/repos","events_url":"https://api.github.com/users/onufrienko/events{/privacy}","received_events_url":"https://api.github.com/users/onufrienko/received_events","type":"User","site_admin":false},"repo":{"id":43598992,"name":"verstka-tasks-1","full_name":"onufrienko/verstka-tasks-1","owner":{"login":"onufrienko","id":14929766,"avatar_url":"https://avatars.githubusercontent.com/u/14929766?v=3","gravatar_id":"","url":"https://api.github.com/users/onufrienko","html_url":"https://github.com/onufrienko","followers_url":"https://api.github.com/users/onufrienko/followers","following_url":"https://api.github.com/users/onufrienko/following{/other_user}","gists_url":"https://api.github.com/users/onufrienko/gists{/gist_id}","starred_url":"https://api.github.com/users/onufrienko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/onufrienko/subscriptions","organizations_url":"https://api.github.com/users/onufrienko/orgs","repos_url":"https://api.github.com/users/onufrienko/repos","events_url":"https://api.github.com/users/onufrienko/events{/privacy}","received_events_url":"https://api.github.com/users/onufrienko/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/onufrienko/verstka-tasks-1","description":"Задача к лекции «HTML, I часть»","fork":true,"url":"https://api.github.com/repos/onufrienko/verstka-tasks-1","forks_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/forks","keys_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/keys{/key_id}","collaborators_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/teams","hooks_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/hooks","issue_events_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/issues/events{/number}","events_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/events","assignees_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/assignees{/user}","branches_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/branches{/branch}","tags_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/tags","blobs_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/git/refs{/sha}","trees_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/git/trees{/sha}","statuses_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/statuses/{sha}","languages_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/languages","stargazers_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/stargazers","contributors_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/contributors","subscribers_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/subscribers","subscription_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/subscription","commits_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/commits{/sha}","git_commits_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/git/commits{/sha}","comments_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/comments{/number}","issue_comment_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/issues/comments{/number}","contents_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/contents/{+path}","compare_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/compare/{base}...{head}","merges_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/merges","archive_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/downloads","issues_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/issues{/number}","pulls_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/pulls{/number}","milestones_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/milestones{/number}","notifications_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/labels{/name}","releases_url":"https://api.github.com/repos/onufrienko/verstka-tasks-1/releases{/id}","created_at":"2015-10-03T12:55:50Z","updated_at":"2015-10-03T12:55:51Z","pushed_at":"2015-10-04T08:33:44Z","git_url":"git://github.com/onufrienko/verstka-tasks-1.git","ssh_url":"git@github.com:onufrienko/verstka-tasks-1.git","clone_url":"https://github.com/onufrienko/verstka-tasks-1.git","svn_url":"https://github.com/onufrienko/verstka-tasks-1","homepage":"","size":121,"stargazers_count":0,"watchers_count":0,"language":"HTML","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"urfu-2015:master","ref":"master","sha":"92106c708076d457b6ffcd8175044271b4318dd9","user":{"login":"urfu-2015","id":14800971,"avatar_url":"https://avatars.githubusercontent.com/u/14800971?v=3","gravatar_id":"","url":"https://api.github.com/users/urfu-2015","html_url":"https://github.com/urfu-2015","followers_url":"https://api.github.com/users/urfu-2015/followers","following_url":"https://api.github.com/users/urfu-2015/following{/other_user}","gists_url":"https://api.github.com/users/urfu-2015/gists{/gist_id}","starred_url":"https://api.github.com/users/urfu-2015/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/urfu-2015/subscriptions","organizations_url":"https://api.github.com/users/urfu-2015/orgs","repos_url":"https://api.github.com/users/urfu-2015/repos","events_url":"https://api.github.com/users/urfu-2015/events{/privacy}","received_events_url":"https://api.github.com/users/urfu-2015/received_events","type":"Organization","site_admin":false},"repo":{"id":43061154,"name":"verstka-tasks-1","full_name":"urfu-2015/verstka-tasks-1","owner":{"login":"urfu-2015","id":14800971,"avatar_url":"https://avatars.githubusercontent.com/u/14800971?v=3","gravatar_id":"","url":"https://api.github.com/users/urfu-2015","html_url":"https://github.com/urfu-2015","followers_url":"https://api.github.com/users/urfu-2015/followers","following_url":"https://api.github.com/users/urfu-2015/following{/other_user}","gists_url":"https://api.github.com/users/urfu-2015/gists{/gist_id}","starred_url":"https://api.github.com/users/urfu-2015/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/urfu-2015/subscriptions","organizations_url":"https://api.github.com/users/urfu-2015/orgs","repos_url":"https://api.github.com/users/urfu-2015/repos","events_url":"https://api.github.com/users/urfu-2015/events{/privacy}","received_events_url":"https://api.github.com/users/urfu-2015/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/urfu-2015/verstka-tasks-1","description":"Задача к лекции «HTML, I часть»","fork":false,"url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1","forks_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/forks","keys_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/keys{/key_id}","collaborators_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/teams","hooks_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/hooks","issue_events_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/issues/events{/number}","events_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/events","assignees_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/assignees{/user}","branches_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/branches{/branch}","tags_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/tags","blobs_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/git/refs{/sha}","trees_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/git/trees{/sha}","statuses_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/statuses/{sha}","languages_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/languages","stargazers_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/stargazers","contributors_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/contributors","subscribers_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/subscribers","subscription_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/subscription","commits_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/commits{/sha}","git_commits_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/git/commits{/sha}","comments_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/comments{/number}","issue_comment_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/issues/comments{/number}","contents_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/contents/{+path}","compare_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/compare/{base}...{head}","merges_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/merges","archive_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/downloads","issues_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/issues{/number}","pulls_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls{/number}","milestones_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/milestones{/number}","notifications_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/labels{/name}","releases_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/releases{/id}","created_at":"2015-09-24T10:45:26Z","updated_at":"2015-10-03T14:28:03Z","pushed_at":"2015-10-04T18:35:22Z","git_url":"git://github.com/urfu-2015/verstka-tasks-1.git","ssh_url":"git@github.com:urfu-2015/verstka-tasks-1.git","clone_url":"https://github.com/urfu-2015/verstka-tasks-1.git","svn_url":"https://github.com/urfu-2015/verstka-tasks-1","homepage":"","size":2114,"stargazers_count":15,"watchers_count":15,"language":"HTML","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":81,"mirror_url":null,"open_issues_count":47,"forks":81,"open_issues":47,"watchers":15,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/59"},"html":{"href":"https://github.com/urfu-2015/verstka-tasks-1/pull/59"},"issue":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/issues/59"},"comments":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/issues/59/comments"},"review_comments":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/59/comments"},"review_comment":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/59/commits"},"statuses":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/statuses/f2c37febd852b218b9a49bc528ad58f8ee1b7b10"}}}}