{"action":"created","comment":{"url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/comments/40698800","id":40698800,"diff_hunk":"@@ -1,3 +1,365 @@\n+<!DOCTYPE html>\n <html>\n-    <!-- Ваш замечательный код -->\n-</html>\n+\t<head>\n+\t\t<title>Homework 1</title>\n+\t\t<meta charset=\"utf-8\">\n+\t\t<style>\n+\t\t\tbody {\n+\t\t\t\tpadding: 2% 5%;\n+\t\t\t}\n+\t\t\tp {\n+\t\t\t\tmax-width: 768px;\n+\t\t\t}\n+\t\t\ttable, th, td {\n+\t\t\t\tpadding: 5px;\n+\t\t\t\ttext-align: center;\n+\t\t\t\tborder-collapse: collapse;\n+\t\t\t\tborder: 1px solid black;\n+\t\t\t}\n+\t\t\tthead {\n+\t\t\t\tbackground-color: #0080FF;\n+\t\t\t}\n+\t\t\tul#comments li {\n+\t\t\t\tmax-width: 768px;\n+\t\t\t\tborder: 1px solid black;\n+\t\t\t\tborder-radius: 5px;\n+\t\t\t\tmargin-bottom: 10px;\n+\t\t\t\tlist-style-type: none;\n+\t\t\t\tpadding: 10px;\n+\t\t\t\tbackground-color:  #0080FF;\n+\t\t\t\tcolor: white;\n+\t\t\t}\n+\t\t\tul#comments li a{\n+\t\t\t\t/*color: #FFC03F;*/\n+\t\t\t\ttext-decoration: underline;\n+\t\t\t\tcolor: white;\n+\t\t\t}\n+\t\t\tul#comments li p {\n+\t\t\t\tpadding: 10px;\n+\t\t\t\tborder-radius: 5px;\n+\t\t\t\tborder-top: 1px solid black;\n+\t\t\t\tbackground-color: #FFFFFF;\n+\t\t\t\tcolor: black;\n+\t\t\t}\n+\t\t</style>\n+\t</head>\n+\t<body>\n+\t\t<header>\n+\t\t\t<h1 style=\"text-align: center;\">\n+\t\t\t\tБлог компании <span style=\"color: red;\">Я</span>ндекс.\n+\t\t\t</h1>\n+\t\t</header>\n+\t\t<article>\n+\t\t\t<h2>\n+\t\t\t\t<span style=\"color: red;\">Я</span>НДЕКС.ПОЧТА: \n+\t\t\t\tКАК МЫ ИЗМЕРЯЕМ СКОРОСТЬ ЗАГРУЗКИ И УЛУЧШАЕМ ЕЁ\n+\t\t\t</h2>\n+\t\t\t<p>\n+\t\t\t\tЕсли ваш сайт медленно грузится, вы рискуете тем, что люди не оценят ни то,\n+\t\t\t\tкакой он красивый, ни то, какой он удобный. Никому не понравится, когда все\n+\t\t\t\tтормозит. Мы регулярно добавляем в Яндекс.Почту новую функциональность,\n+\t\t\t\tиногда — исправляем ошибки, а это значит, у нас постоянно появляются новый код\n+\t\t\t\tи новая логика. Всё это напрямую влияет на скорость работы интерфейса.\n+\t\t\t</p>\n+\t\t\t<h3>Что мы измеряем</h3>\n+\t\t\t<p>\n+\t\t\t\tЭтапы первой загрузки:\n+\t\t\t\t<ul>\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</p>\n+\t\t\t<p>\n+\t\t\t\tЭтапы отрисовки любой страницы:\n+\t\t\t\t<ul>\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</p>\n+\t\t\t<p>\n+\t\t\t\t— <q>Ок, теперь у нас есть метрики, мы можем отправить их на сервер</q> - \n+\t\t\t\t\tговорим мы<br>\n+\t\t\t\t— <q>Что же дальше?</q> - вопрошаете вы<br>\n+\t\t\t\t— <q>А давай построим график!</q> - отвечаем мы<br>\n+\t\t\t\t— <q>А что будем считать?</q> - уточняете вы\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\tКак вы знаете, <dfn>медиана</dfn> – это серединное, а не среднее значение в выборке.\n+\t\t\t\tЕсли у нас имеются числа 1, 2, 2, 3, 8, 10, 20, то медиана – 3, а среднее – 6,5.\n+\t\t\t\tВ общем случае медиана отлично показывает, сколько грузится средний пользователь.\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\tВ случае ускорения или замедления медиана, конечно, изменится. Но она не может\n+\t\t\t\tрассказать, сколько пользователей ускорилось, а сколько замедлилось.\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\t<abbr>APDEX</abbr> – метрика, которая сразу говорит: хорошо или плохо. Метрика\n+\t\t\t\tработает очень просто. Мы выбираем временной интервал [0; t], такой, что если\n+\t\t\t\tвремя показа страницы попало в него, то пользователь счастлив. Берем еще один\n+\t\t\t\tинтервал, (t; 4t] (в четыре раза больше первого), и считаем, что если страница\n+\t\t\t\tпоказана за это время, то пользователь в целом удовлетворен скоростью работы,\n+\t\t\t\tно уже не настолько счастлив. И применяем формулу:\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\t<em>(кол-во счастливых пользователей + кол-во удовлетворенных / 2) / \n+\t\t\t\t(кол-во всех).</em><br> Получается значение от нуля до единицы, которое, \n+\t\t\t\tвидимо, лучше всего показывает, хорошо или плохо работает почта.\n+\t\t\t</p>\n+\t\t\t<h3>Как мы измеряем</h3>\n+\t\t\t<p>\n+\t\t\t\tСейчас модуль обновления сам логирует все свои стадии, и можно легко понять\n+\t\t\t\tпричину замедления: медленнее стал отвечать сервер либо слишком долго\n+\t\t\t\tвыполняется JavaScript. Выглядит это примерно так:\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\t<code>this.timings['look-ma-im-start'] = Date.now();</code><br>\n+\t\t\t\t<code>this.timings['look-ma-finish'] = Date.now();</code>\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\tC помощью <code>Date.now()</code> мы получаем текущее время. Все тайминги \n+\t\t\t\tсобираются и при отправке рассчитываются. На этапах разница между \n+\t\t\t\t<em>“end”</em> и <em>“start”</em> не считается, а все вычисления производятся \n+\t\t\t\tв конце:\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\t<code>\n+\t\t\t\t\tvar totalTime = this.timings['look-ma-finish'] - \n+\t\t\t\t\tthis.timings['look-ma-im-start'];\n+\t\t\t\t</code>\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\tИ на сервер прилетают подобные записи:<br>\n+\t\t\t\t<code>serverResponse=50&domUpdate=60</code>\n+\t\t\t</p>\n+\t\t\t<h3>Как мы ускоряем</h3>\n+\t\t\t<p>\n+\t\t\t\tЧтобы снизить время загрузки почты при выходе новых версий,\n+\t\t\t\tмы уже делаем следующее:\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\t<ul>\n+\t\t\t\t\t<li> включаем gzip;</li>\n+\t\t\t\t\t<li> выставляем заголовки кэширования;</li>\n+\t\t\t\t\t<li> фризим CSS, JS, шаблоны и картинки;</li>\n+\t\t\t\t\t<li> используем CDN;</li>\n+\t\t\t\t</ul>\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\tМы подумали: <i>«А что если хранить где-то старую версию файлов, а при выходе новой\n+\t\t\t\tпередавать только diff между ней и той, которая сохранена у пользователя?»</i>\n+\t\t\t\tВ браузере же останется просто наложить патч на клиенте.\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\tНа самое деле эта идея не нова. Уже существуют стандарты для HTTP — например,\n+\t\t\t\t<em>RFC 3229 «Delta encoding in HTTP»</em> и <em>«Google SDHC»</em>, — но по \n+\t\t\t\tразным причинам они не получили должного распространения в браузерах и на серверах.\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\tМы же решили сделать свой аналог на JS. Чтобы реализовать этот метод обновления,\n+\t\t\t\tначали искать реализации diff на JS. На популярных хостингах кода нашли\n+\t\t\t\tбиблиотеки:\n+\t\t\t\t<ul>\n+\t\t\t\t\t<li> VCDiff</li>\n+\t\t\t\t\t<li> google-diff-patch-match</li>\n+\t\t\t\t</ul>\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\tДля окончательного выбора библиотеки нам нужно сравнить:\n+\t\t\t</p>\n+\t\t\t<table>\n+\t\t\t\t<thead>\n+\t\t\t\t\t<tr>\n+\t\t\t\t\t\t<th>Библиотека</th>\n+\t\t\t\t\t\t<th>IE9</th>\n+\t\t\t\t\t\t<th>Opera 12</th>\n+\t\t\t\t\t</tr>\n+\t\t\t\t</thead>\n+\t\t\t\t<tbody>\n+\t\t\t\t\t<tr>\n+\t\t\t\t\t\t<td>vcdiff</td>\n+\t\t\t\t\t\t<td>8</td>\n+\t\t\t\t\t\t<td>5</td>\n+\t\t\t\t\t</tr>\n+\t\t\t\t\t<tr>\n+\t\t\t\t\t\t<td>google diff</td>\n+\t\t\t\t\t\t<td>1363</td>\n+\t\t\t\t\t\t<td>76</td>\n+\t\t\t\t\t</tr>\n+\t\t\t\t</tbody>\n+\t\t\t</table>\n+\t\t\t<p>\n+\t\t\t\tПосле того как мы определились с библиотекой для диффа, нужно определиться с тем,\n+\t\t\t\tгде и как хранить статику на клиенте.\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\tФормат файла с патчами для проекта выглядит так:\n+\t\t\t\t<pre>\n+\t\t\t\t\t<code>\n+[\n+\t{\n+\t\t\"k\": \"jane.css\",\n+\t\t\"p\": [patch],\n+\t\t\"s\": 4554\n+\t},\n+\n+\t{\n+\t\t\"k\": \"jane.css\",\n+\t\t\"p\": [patch],\n+\t\t\"s\": 4554\n+\t}\n+]\n+\t\t\t\t\t</code>\n+\t\t\t\t</pre>\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\tТо есть это обычный массив из объектов. Каждый объект — отдельный ресурс. У\n+\t\t\t\tкаждого объекта есть три свойства. <var>k</var> — названия ключа в localStorage \n+\t\t\t\tдля этого ресурса. <var>p</var> — патч для ресурса, который сгенерировал vcdiff. \n+\t\t\t\t<var>s</var> — чексумма для ресурса актуальной версии, чтобы потом можно было \n+\t\t\t\tпроверить правильность наложения патча на клиенте. Чексумма вычисляется по \n+\t\t\t\tалгоритму Флетчера.\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\t<em>Алгоритм Бройдена — Флетчера — Гольдфарба — Шанно (BFGS)</em>\n+\t\t\t\t— итерационный метод численной оптимизации, предназначенный для\n+\t\t\t\tнахождения локального максимума/минимума нелинейного функционала\n+\t\t\t\tбез ограничений.\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\tПочему именно алгоритм Флетчера, а не другие популярные алгоритмы вроде:\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\t<abbr>CRC16/32</abbr> - алгоритм нахождения контрольной суммы, предназначенный для \n+\t\t\t\tпроверки целостности данных\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\t<abbr>md5</abbr> - 128-битный алгоритм хеширования. Предназначен для создания \n+\t\t\t\t«отпечатков» или дайджестов сообщения произвольной длины и последующей проверки\n+\t\t\t\tих подлинности.\n+\t\t\t</p>\n+\t\t\t<p>\n+\t\t\t\tПотому что он быстрый, компактный и легок в реализации.\n+\t\t\t</p>\n+\t\t\t<h3>Итог</h3>\n+\t\t\t<p>\n+\t\t\t\tФактически мы экономим 80-90% трафика. Размер загружаемой статитки в байтах:\n+\t\t\t</p>\n+\t\t\t<table>\n+\t\t\t\t<thead>\n+\t\t\t\t\t<tr>\n+\t\t\t\t\t\t<th>Релиз</th>\n+\t\t\t\t\t\t<th>С патчем</th>\n+\t\t\t\t\t\t<th>Без патча</th>\n+\t\t\t\t\t</tr>\n+\t\t\t\t</thead>\n+\t\t\t\t<tbody>\n+\t\t\t\t\t<tr>\n+\t\t\t\t\t\t<td>7.7.20</td>\n+\t\t\t\t\t\t<td>397</td>\n+\t\t\t\t\t\t<td>174 549</td>\n+\t\t\t\t\t</tr>\n+\t\t\t\t\t<tr>\n+\t\t\t\t\t\t<td>7.7.21</td>\n+\t\t\t\t\t\t<td>383</td>\n+\t\t\t\t\t\t<td>53 995</td>\n+\t\t\t\t\t</tr>\n+\t\t\t\t\t<tr>\n+\t\t\t\t\t\t<td>7.7.22</td>\n+\t\t\t\t\t\t<td>483</td>\n+\t\t\t\t\t\t<td>3 995</td>\n+\t\t\t\t\t</tr>\n+\t\t\t\t</tbody>\n+\t\t\t</table>\n+\t\t\t<h2>Алгоритм Флетчера</h2>\n+\t\t\t<p>\n+\t\t\t\tДано <var>&epsilon;</var>, <var>x</var><sub>0</sub><br>\n+\t\t\t\tИнициализировать <var>H</var><sub>0</sub><br>\n+\t\t\t\t<var>k</var> = 0<br>\n+\t\t\t\twhile ||<var>&nabla;</var> || > <var>&epsilon;</var>\n+\t\t\t\t\t<p style=\"margin-top: -1em; margin-bottom: 0; padding-left: 2em;\">\n+\t\t\t\t\t\tНайти направление <var>p</var><sub>k</sub> = \n+\t\t\t\t\t\t\t-<var>C</var><sub>k</sub><var>&nabla;</var> <var>f</var><sub>k</sub><br>\n+\t\t\t\t\t\tВычислить <var>x</var><sub>k+1</sub> = \n+\t\t\t\t\t\t\t<var>x</var><sub>k</sub> + <var>a</var><sub>k</sub> \n+\t\t\t\t\t\t\t<var>p</var><sub>k</sub>, <var>a</var><sub>k</sub> \n+\t\t\t\t\t\t\tудовлетворяет условиям Вольфе<br>\n+\t\t\t\t\t\tОбозначить <var>p</var><sub>k</sub> = <var>x</var><sub>k+1</sub> - \n+\t\t\t\t\t\t\t<var>x</var><sub>k</sub> и <var>y</var><sub>k</sub> = \n+\t\t\t\t\t\t\t<var>&nabla;</var> <var>f</var><sub>k+1</sub> - <var>&nabla;</var> \n+\t\t\t\t\t\t\t<var>f</var><sub>k</sub><br>\n+\t\t\t\t\t\tВычислить <var>C</var><sub>k+1</sub><br>\n+\t\t\t\t\t\t<var>k</var> = <var>k</var> + 1\n+\t\t\t\t\t</p>\n+\t\t\t\tend\n+\t\t\t</p>\n+\t\t</article>\n+\t\t<article>\n+\t\t\t<hr>\n+\t\t\t<p>","path":"index.html","position":305,"original_position":305,"commit_id":"58b6e90caa512a8d89162528ea1493bbf058c9c3","original_commit_id":"58b6e90caa512a8d89162528ea1493bbf058c9c3","user":{"login":"sinseveriya","id":5352441,"avatar_url":"https://avatars.githubusercontent.com/u/5352441?v=3","gravatar_id":"","url":"https://api.github.com/users/sinseveriya","html_url":"https://github.com/sinseveriya","followers_url":"https://api.github.com/users/sinseveriya/followers","following_url":"https://api.github.com/users/sinseveriya/following{/other_user}","gists_url":"https://api.github.com/users/sinseveriya/gists{/gist_id}","starred_url":"https://api.github.com/users/sinseveriya/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sinseveriya/subscriptions","organizations_url":"https://api.github.com/users/sinseveriya/orgs","repos_url":"https://api.github.com/users/sinseveriya/repos","events_url":"https://api.github.com/users/sinseveriya/events{/privacy}","received_events_url":"https://api.github.com/users/sinseveriya/received_events","type":"User","site_admin":false},"body":"И зачем нам это в `p` заворачивать?","created_at":"2015-09-29T17:09:06Z","updated_at":"2015-09-29T17:09:06Z","html_url":"https://github.com/urfu-2015/verstka-tasks-1/pull/5#discussion_r40698800","pull_request_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/5","_links":{"self":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/comments/40698800"},"html":{"href":"https://github.com/urfu-2015/verstka-tasks-1/pull/5#discussion_r40698800"},"pull_request":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/5"}}},"pull_request":{"url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/5","id":46098820,"html_url":"https://github.com/urfu-2015/verstka-tasks-1/pull/5","diff_url":"https://github.com/urfu-2015/verstka-tasks-1/pull/5.diff","patch_url":"https://github.com/urfu-2015/verstka-tasks-1/pull/5.patch","issue_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/issues/5","number":5,"state":"open","locked":false,"title":"Пестов Никита","user":{"login":"Nikit0s","id":6998975,"avatar_url":"https://avatars.githubusercontent.com/u/6998975?v=3","gravatar_id":"","url":"https://api.github.com/users/Nikit0s","html_url":"https://github.com/Nikit0s","followers_url":"https://api.github.com/users/Nikit0s/followers","following_url":"https://api.github.com/users/Nikit0s/following{/other_user}","gists_url":"https://api.github.com/users/Nikit0s/gists{/gist_id}","starred_url":"https://api.github.com/users/Nikit0s/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Nikit0s/subscriptions","organizations_url":"https://api.github.com/users/Nikit0s/orgs","repos_url":"https://api.github.com/users/Nikit0s/repos","events_url":"https://api.github.com/users/Nikit0s/events{/privacy}","received_events_url":"https://api.github.com/users/Nikit0s/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-09-27T10:11:33Z","updated_at":"2015-09-29T17:09:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"12911a4e76847b1ea8339bef89312207a90611ef","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/5/commits","review_comments_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/5/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/5/comments","statuses_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/statuses/58b6e90caa512a8d89162528ea1493bbf058c9c3","head":{"label":"Nikit0s:master","ref":"master","sha":"58b6e90caa512a8d89162528ea1493bbf058c9c3","user":{"login":"Nikit0s","id":6998975,"avatar_url":"https://avatars.githubusercontent.com/u/6998975?v=3","gravatar_id":"","url":"https://api.github.com/users/Nikit0s","html_url":"https://github.com/Nikit0s","followers_url":"https://api.github.com/users/Nikit0s/followers","following_url":"https://api.github.com/users/Nikit0s/following{/other_user}","gists_url":"https://api.github.com/users/Nikit0s/gists{/gist_id}","starred_url":"https://api.github.com/users/Nikit0s/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Nikit0s/subscriptions","organizations_url":"https://api.github.com/users/Nikit0s/orgs","repos_url":"https://api.github.com/users/Nikit0s/repos","events_url":"https://api.github.com/users/Nikit0s/events{/privacy}","received_events_url":"https://api.github.com/users/Nikit0s/received_events","type":"User","site_admin":false},"repo":{"id":43241384,"name":"verstka-tasks-1","full_name":"Nikit0s/verstka-tasks-1","owner":{"login":"Nikit0s","id":6998975,"avatar_url":"https://avatars.githubusercontent.com/u/6998975?v=3","gravatar_id":"","url":"https://api.github.com/users/Nikit0s","html_url":"https://github.com/Nikit0s","followers_url":"https://api.github.com/users/Nikit0s/followers","following_url":"https://api.github.com/users/Nikit0s/following{/other_user}","gists_url":"https://api.github.com/users/Nikit0s/gists{/gist_id}","starred_url":"https://api.github.com/users/Nikit0s/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Nikit0s/subscriptions","organizations_url":"https://api.github.com/users/Nikit0s/orgs","repos_url":"https://api.github.com/users/Nikit0s/repos","events_url":"https://api.github.com/users/Nikit0s/events{/privacy}","received_events_url":"https://api.github.com/users/Nikit0s/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Nikit0s/verstka-tasks-1","description":"Задача к лекции «HTML, I часть»","fork":true,"url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1","forks_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/forks","keys_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/teams","hooks_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/hooks","issue_events_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/issues/events{/number}","events_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/events","assignees_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/assignees{/user}","branches_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/branches{/branch}","tags_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/tags","blobs_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/git/refs{/sha}","trees_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/statuses/{sha}","languages_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/languages","stargazers_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/stargazers","contributors_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/contributors","subscribers_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/subscribers","subscription_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/subscription","commits_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/commits{/sha}","git_commits_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/git/commits{/sha}","comments_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/comments{/number}","issue_comment_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/issues/comments{/number}","contents_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/contents/{+path}","compare_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/merges","archive_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/downloads","issues_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/issues{/number}","pulls_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/pulls{/number}","milestones_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/milestones{/number}","notifications_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/labels{/name}","releases_url":"https://api.github.com/repos/Nikit0s/verstka-tasks-1/releases{/id}","created_at":"2015-09-27T09:40:34Z","updated_at":"2015-09-27T09:40:37Z","pushed_at":"2015-09-29T16:41:31Z","git_url":"git://github.com/Nikit0s/verstka-tasks-1.git","ssh_url":"git@github.com:Nikit0s/verstka-tasks-1.git","clone_url":"https://github.com/Nikit0s/verstka-tasks-1.git","svn_url":"https://github.com/Nikit0s/verstka-tasks-1","homepage":"","size":99,"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":"74939664628b40cb51efdd5b6c81c3729ab3730b","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-09-29T11:33:53Z","pushed_at":"2015-09-29T16:48:40Z","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":397,"stargazers_count":12,"watchers_count":12,"language":"HTML","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":36,"mirror_url":null,"open_issues_count":14,"forks":36,"open_issues":14,"watchers":12,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/5"},"html":{"href":"https://github.com/urfu-2015/verstka-tasks-1/pull/5"},"issue":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/issues/5"},"comments":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/issues/5/comments"},"review_comments":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/5/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/5/commits"},"statuses":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/statuses/58b6e90caa512a8d89162528ea1493bbf058c9c3"}}}}