{"action":"created","comment":{"url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/comments/41110591","id":41110591,"diff_hunk":"@@ -1,3 +1,427 @@\n-<html>\n-    <!-- Ваш замечательный код -->\n-</html>\n+<!DOCTYPE html>\n+<html lang=\"ru\">\n+    <head>\n+        <meta charset=\"utf-8\">\n+        <title>Блог компании Яндекс.</title>\n+        <meta name=\"author\" content=\"Aleksei Androsov\">\n+        <style>\n+            table\n+            {\n+                border-collapse: collapse;\n+                border: 1px solid black;\n+            }\n+\n+            td, \n+            th\n+            {\n+                border: 1px solid black;\n+                padding: 0 20px;\n+            }\n+\n+            div\n+            {\n+                padding-left: 30px;\n+            }\n+\n+            .formula\n+            {\n+                font-style: italic;\n+                font-weight: bold;\n+            }\n+\n+            .without-marker\n+            {\n+                list-style-type: none;\n+            }\n+\n+            .bold-font\n+            {\n+                font-weight: bold;\n+            }\n+        </style>\n+    </head>\n+    <body>\n+        <header>\n+            <h1>ЯНДЕКС.ПОЧТА: КАК МЫ ИЗМЕРЯЕМ СКОРОСТЬ ЗАГРУЗКИ И УЛУЧШАЕМ ЕЁ</h1>\n+        </header>\n+        <main>\n+            <article>        \n+                <p>\n+                    Если ваш сайт медленно грузится, вы рискуете тем, что люди не оценят ни то,\n+                    какой он красивый, ни то, какой он удобный. Никому не понравится, когда все\n+                    тормозит. Мы регулярно добавляем в Яндекс.Почту новую функциональность,\n+                    иногда &mdash; исправляем ошибки, а это значит, у нас постоянно появляются новый код\n+                    и новая логика. Всё это напрямую влияет на скорость работы интерфейса.\n+                </p>            \n+                <h2>Что мы измеряем</h2>\n+                <p>Этапы первой загрузки:</p>\n+                <ul>\n+                    <li>подготовка;</li>\n+                    <li>\n+                        загрузка статики \n+                        (<abbr title=\"Hypertext Transfer Protocol\">HTTP</abbr>-запрос и парсинг);\n+                    </li>\n+                    <li>исполнение модулей;</li>\n+                    <li>инициализация базовых объектов;</li>\n+                    <li>отрисовка.</li>\n+                </ul>\n+                <p>Этапы отрисовки любой страницы:</p>\n+                <ul>\n+                    <li>подготовка к запросу на сервер;</li>\n+                    <li>запрос данных с сервера;</li>\n+                    <li>шаблонизация;</li>\n+                    <li>обновление <abbr title=\"Document Object Model\">DOM</abbr>.</li>\n+                </ul>\n+                <p>\n+                    &ndash; <q>Ок, теперь у нас есть метрики, \n+                    мы можем отправить их на сервер</q> &ndash; говорим мы<br>\n+                    &ndash; <q>Что же дальше?</q> &ndash; вопрошаете вы<br>\n+                    &ndash; <q>А давай построим график!</q> &ndash; отвечаем мы<br>\n+                    &ndash; <q>А что будем считать?</q> &ndash; уточняете вы<br>\n+                </p>\n+                <p>\n+                    Как вы знаете, <dfn>медиана</dfn> &ndash; это серединное, \n+                    а не среднее значение в выборке.<br>\n+                    Если у нас имеются числа 1, 2, 2, 3, 8, 10, 20, то медиана &ndash; 3, \n+                    а среднее &ndash; 6,5.<br>\n+                    В общем случае медиана отлично показывает, сколько грузится средний пользователь.\n+                </p>\n+                <p>\n+                    В случае ускорения или замедления медиана, конечно, изменится. Но она не может\n+                    рассказать, сколько пользователей ускорилось, а сколько замедлилось.\n+                </p>\n+                <p>\n+                    <abbr title=\"Application Performance Index\">APDEX</abbr> &ndash; метрика, которая сразу говорит: хорошо или плохо. \n+                    Метрика работает очень просто. Мы выбираем временной интервал [0; t], такой, что если\n+                    время показа страницы попало в него, то пользователь счастлив. Берем еще один\n+                    интервал, (t; 4t] (в четыре раза больше первого), и считаем, что если страница\n+                    показана за это время, то пользователь в целом удовлетворен скоростью работы,\n+                    но уже не настолько счастлив. И применяем формулу:\n+                </p>\n+                <p>\n+                    <math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n+                        <mfrac>\n+                            <mrow>\n+                                <mi>кол-во счастливых пользователей</mi>\n+                                <mo>&plus;</mo>\n+                                <mfrac>\n+                                    <mi>кол-во удовлетворенных</mi>\n+                                    <mi>2</mi>\n+                                </mfrac>\n+                            </mrow>\n+                            <mrow>\n+                                <mi>кол-во всех</mi>\n+                            </mrow>\n+                        </mfrac>\n+                    </math>.\n+                </p>\n+                <p>\n+                    Получается значение от нуля до единицы, которое, видимо, лучше всего показывает,\n+                    хорошо или плохо работает почта.\n+                </p>\n+\n+                <h2>Как мы измеряем</h2>\n+                <p>\n+                    Сейчас модуль обновления сам логирует все свои стадии, и можно легко понять\n+                    причину замедления: медленнее стал отвечать сервер либо слишком долго\n+                    выполняется JavaScript. Выглядит это примерно так:\n+                    <pre><code>\n+        this.timings['look-ma-im-start'] = Date.now();\n+        this.timings['look-ma-finish'] = Date.now();\n+                    </code></pre>\n+                </p>\n+                <p>\n+                    C помощью <code>Date.now()</code> мы получаем текущее время. Все тайминги собираются и при\n+                    отправке рассчитываются. \n+                    На этапах разница между \"end\" и \"start\"\n+                    не считается, а все вычисления производятся в конце:\n+                    <pre><code>\n+        var totalTime = this.timings['look-ma-finish'] - this.timings['look-ma-im-start'];\n+                    </code></pre>\n+                    И на сервер прилетают подобные записи:<br>\n+                    <samp>serverResponse=50&amp;domUpdate=60</samp>\n+                </p>\n+\n+                <h2>Как мы ускоряем</h2>\n+                <p>\n+                    Чтобы снизить время загрузки почты при выходе новых версий,\n+                    мы уже делаем следующее:\n+                </p>\n+                <ul>\n+                    <li>включаем gzip;</li>\n+                    <li>выставляем заголовки кэширования;</li>\n+                    <li>\n+                        фризим <abbr title=\"Cascading Style Sheets\">CSS</abbr>, \n+                        <abbr title=\"JavaScript\">JS</abbr>, шаблоны и картинки;\n+                    </li>\n+                    <li>используем <abbr title=\"Content Delivery Network\">CDN</abbr>;</li>\n+                </ul>\n+                <p>\n+                    Мы подумали: <q>А что если хранить где-то старую версию файлов, \n+                    а при выходе новой передавать только diff между ней и той, \n+                    которая сохранена у пользователя?</q>\n+                    В браузере же останется просто наложить патч на клиенте.\n+                </p>\n+                <p>\n+                    На самое деле эта идея не нова. \n+                    Уже существуют стандарты для <abbr title=\"Hypertext Transfer Protocol\">HTTP</abbr> &mdash; например,\n+                    RFC 3229 &laquo;Delta encoding in HTTP&raquo; и &laquo;Google SDHC&raquo;,\n+                    &mdash; но по разным причинам они не получили должного \n+                    распространения в браузерах и на серверах.\n+                </p>\n+                <p>\n+                    Мы же решили сделать свой аналог на JS. Чтобы реализовать этот метод обновления,\n+                    начали искать реализации diff на JS. На популярных хостингах кода нашли\n+                    библиотеки:\n+                    <ul>\n+                        <li class=\"without-marker\">- VCDiff</li>\n+                        <li class=\"without-marker\">- google-diff-patch-match</li>\n+                    </ul>\n+                </p>\n+                <p>\n+                    Для окончательного выбора библиотеки нам нужно сравнить:\n+                    <table>\n+                        <thead>\n+                            <tr>\n+                                <th>Библиотека</th> \n+                                <th>IE 9</th>\n+                                <th>Opera 12</th>\n+                            </tr>\n+                        </thead>\n+                        <tbody>\n+                            <tr>\n+                                <td>vcdiff</td>\n+                                <td>8</td>\n+                                <td>5</td>\n+                            </tr>\n+                            <tr>\n+                                <td>google diff</td>\n+                                <td>1363</td>\n+                                <td>76</td>\n+                            </tr>\n+                        </tbody>\n+                    </table>\n+                </p>\n+                <p>\n+                    После того как мы определились с библиотекой для диффа, нужно определиться с тем,\n+                    где и как хранить статику на клиенте.\n+                </p>\n+                <p>\n+                    Формат файла с патчами для проекта выглядит так:\n+                    <pre><code>\n+        [\n+            {\n+                \"k\": \"jane.css\",\n+                \"p\": [patch],\n+                \"s\": 4554\n+            },\n+            {\n+                \"k\": \"jane.css\",\n+                \"p\": [patch],\n+                \"s\": 4554\n+            }\n+        ]\n+                    </code></pre>\n+                </p>\n+                <p>\n+                    То есть это обычный массив из объектов. Каждый объект &mdash; отдельный ресурс. \n+                    У каждого объекта есть три свойства. \n+                    <var>k</var> &mdash; названия ключа в localStorage для этого ресурса. \n+                    <var>p</var> &mdash; патч для ресурса, который сгенерировал vcdiff.\n+                    <var>s</var> &mdash; чексумма для ресурса актуальной версии, \n+                    чтобы потом можно было проверить правильность наложения патча на клиенте. \n+                    Чексумма вычисляется по алгоритму Флетчера.\n+                </p>\n+                <p>\n+                    Алгоритм Бройдена &mdash; Флетчера &mdash; Гольдфарба &mdash; Шанно (BFGS)\n+                    &mdash; итерационный метод численной оптимизации, предназначенный для\n+                    нахождения локального максимума/минимума нелинейного функционала\n+                    без ограничений.\n+                </p>\n+                <p>\n+                    Алгоритм Флетчера\n+                    <div>\n+                        <span>Дано: </span>\n+                        <span class=\"formula\">&epsilon;, x<sub>0</sub></span><br>\n+                        <span>Инициализировать: </span>\n+                        <span class=\"formula\">H<sub>0</sub></span><br>\n+                        <span class=\"formula\">k</span> <span>= 0</span><br>\n+                        <span class=\"bold-font\">while</span>\n+                        <span> &#8214;&nabla;&#402;<sub>k</sub>&#8214; &#62; </span>\n+                        <span class=\"formula\">&epsilon;</span><br>\n+                        <div style=\"padding-left:30px;\">\n+                            <span>\n+                                найти направление </span>\n+                                <span class=\"formula\">p<sub>k</sub> = \n+                                -C<sub>k</sub> &nabla;&#402;<sub>k</sub>\n+                            </span><br>\n+                            <span>\n+                                вычислить </span>\n+                                <span class=\"formula\">x<sub>k+1</sub> = x<sub>k</sub> \n+                                + &alpha;<sub>k</sub>p<sub>k</sub>, &alpha;<sub>k</sub></span> \n+                                <span>удовлетворяет условиям Вольфе</span>\n+                            </span><br>\n+                            <span>\n+                                обозначить </span>\n+                                <span class=\"formula\">s<sub>k</sub> = x<sub>k+1</sub> \n+                                - x<sub>k</sub>\n+                                и y<sub>k</sub> = &nabla;&#402;<sub>k+1</sub>\n+                                -&nabla;&#402;<sub>k</sub>\n+                            </span><br>\n+                            <span>\n+                                вычислить </span>\n+                                <span class=\"formula\">C<sub>k+1</sub>\n+                            </span><br>\n+                            <span class=\"formula\">\n+                                k = k+1\n+                            </span><br>\n+                        </div>\n+                        <span class=\"bold-font\">\n+                            end\n+                        </span>\n+                    </div>\n+                </p>\n+                <p>\n+                    Почему именно алгоритм Флетчера, а не другие популярные алгоритмы вроде:\n+                    <dl>\n+                        <dt>CRC16/32</dt> &ndash; \n+                        <dd>\n+                            алгоритм нахождения контрольной суммы, \n+                            предназначенный для проверкицелостности данных\n+                        </dd>\n+                        <dt>md5</dt> &ndash; \n+                        <dd>\n+                            128-битный алгоритм хеширования. Предназначен для создания \n+                            \"отпечатков\"\n+                            или дайджестов сообщения произвольной длины и последующей проверки\n+                            их подлинности.\n+                        </dd>\n+                    </dl>\n+                </p>\n+                <p>Потому что он быстрый, компактный и легок в реализации.</p>\n+\n+                <h2>Итог</h2>\n+                <p>\n+                    Фактически мы экономим 80&ndash;90% трафика. Размер загружаемой статитки в байтах:\n+                    <table>\n+                        <thead>\n+                            <tr>\n+                                <th>Релиз</th>\n+                                <th>С патчем</th>\n+                                <th>Без патча</th>\n+                            </tr>\n+                        </thead>\n+                        <tbody>\n+                            <tr>\n+                                <td>7.7.20</td>\n+                                <td>397</td>\n+                                <td>174 549</td>\n+                            </tr>\n+                            <tr>\n+                                <td>7.7.21</td>\n+                                <td>383</td>\n+                                <td>53 995</td>\n+                            </tr>\n+                            <tr>\n+                                <td>7.7.22</td>\n+                                <td>483</td>\n+                                <td>3 995</td>\n+                            </tr>\n+                        </tbody>\n+                    </table>\n+                </p>\n+                <address>\n+                    Автор: \n+                    <a href=\"https://twitter.com/doochik\">@doochik</a><br>\n+                    С++ разработик<br>\n+                    Электронная почта: \n+                    <a href=\"mailto:doochik@yandex-team.ru\">(doochik@yandex&ndash;team.ru)</a><br>\n+                    Компания: \n+                    <a href=\"https://ya.ru\"> Яндекс</a>\n+                </address>\n+            </article>        \n+\t\t\t<section>\n+\t\t\t\t<h2>Комментарии (3):</h2>\n+\t\t\t\t<article>\n+\t\t\t\t\t<p>\n+\t\t\t\t\t\t&mdash; Mogaika \n+                        <a href=\"mailto:mogaika@yandex-team.ru\">\n+\t\t\t\t\t\t  (mogaika@yandex&ndash;team.ru)","path":"index.html","position":352,"original_position":352,"commit_id":"b6717e802e18a9839844b2f266e43909edc55356","original_commit_id":"b6717e802e18a9839844b2f266e43909edc55356","user":{"login":"xiiivii","id":14858283,"avatar_url":"https://avatars.githubusercontent.com/u/14858283?v=3","gravatar_id":"","url":"https://api.github.com/users/xiiivii","html_url":"https://github.com/xiiivii","followers_url":"https://api.github.com/users/xiiivii/followers","following_url":"https://api.github.com/users/xiiivii/following{/other_user}","gists_url":"https://api.github.com/users/xiiivii/gists{/gist_id}","starred_url":"https://api.github.com/users/xiiivii/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xiiivii/subscriptions","organizations_url":"https://api.github.com/users/xiiivii/orgs","repos_url":"https://api.github.com/users/xiiivii/repos","events_url":"https://api.github.com/users/xiiivii/events{/privacy}","received_events_url":"https://api.github.com/users/xiiivii/received_events","type":"User","site_admin":false},"body":"тоже просто дефис)","created_at":"2015-10-05T04:54:10Z","updated_at":"2015-10-05T04:54:10Z","html_url":"https://github.com/urfu-2015/verstka-tasks-1/pull/54#discussion_r41110591","pull_request_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/54","_links":{"self":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/comments/41110591"},"html":{"href":"https://github.com/urfu-2015/verstka-tasks-1/pull/54#discussion_r41110591"},"pull_request":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/54"}}},"pull_request":{"url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/54","id":46611566,"html_url":"https://github.com/urfu-2015/verstka-tasks-1/pull/54","diff_url":"https://github.com/urfu-2015/verstka-tasks-1/pull/54.diff","patch_url":"https://github.com/urfu-2015/verstka-tasks-1/pull/54.patch","issue_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/issues/54","number":54,"state":"open","locked":false,"title":"Ветошко Дарья","user":{"login":"vetoshko","id":5564166,"avatar_url":"https://avatars.githubusercontent.com/u/5564166?v=3","gravatar_id":"","url":"https://api.github.com/users/vetoshko","html_url":"https://github.com/vetoshko","followers_url":"https://api.github.com/users/vetoshko/followers","following_url":"https://api.github.com/users/vetoshko/following{/other_user}","gists_url":"https://api.github.com/users/vetoshko/gists{/gist_id}","starred_url":"https://api.github.com/users/vetoshko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vetoshko/subscriptions","organizations_url":"https://api.github.com/users/vetoshko/orgs","repos_url":"https://api.github.com/users/vetoshko/repos","events_url":"https://api.github.com/users/vetoshko/events{/privacy}","received_events_url":"https://api.github.com/users/vetoshko/received_events","type":"User","site_admin":false},"body":null,"created_at":"2015-10-02T08:13:04Z","updated_at":"2015-10-05T04:54:10Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0ff1fe9d6bc48a6e127a37d75cd0f9e237355ddc","assignee":{"login":"xiiivii","id":14858283,"avatar_url":"https://avatars.githubusercontent.com/u/14858283?v=3","gravatar_id":"","url":"https://api.github.com/users/xiiivii","html_url":"https://github.com/xiiivii","followers_url":"https://api.github.com/users/xiiivii/followers","following_url":"https://api.github.com/users/xiiivii/following{/other_user}","gists_url":"https://api.github.com/users/xiiivii/gists{/gist_id}","starred_url":"https://api.github.com/users/xiiivii/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xiiivii/subscriptions","organizations_url":"https://api.github.com/users/xiiivii/orgs","repos_url":"https://api.github.com/users/xiiivii/repos","events_url":"https://api.github.com/users/xiiivii/events{/privacy}","received_events_url":"https://api.github.com/users/xiiivii/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/54/commits","review_comments_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/54/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/54/comments","statuses_url":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/statuses/b6717e802e18a9839844b2f266e43909edc55356","head":{"label":"vetoshko:master","ref":"master","sha":"b6717e802e18a9839844b2f266e43909edc55356","user":{"login":"vetoshko","id":5564166,"avatar_url":"https://avatars.githubusercontent.com/u/5564166?v=3","gravatar_id":"","url":"https://api.github.com/users/vetoshko","html_url":"https://github.com/vetoshko","followers_url":"https://api.github.com/users/vetoshko/followers","following_url":"https://api.github.com/users/vetoshko/following{/other_user}","gists_url":"https://api.github.com/users/vetoshko/gists{/gist_id}","starred_url":"https://api.github.com/users/vetoshko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vetoshko/subscriptions","organizations_url":"https://api.github.com/users/vetoshko/orgs","repos_url":"https://api.github.com/users/vetoshko/repos","events_url":"https://api.github.com/users/vetoshko/events{/privacy}","received_events_url":"https://api.github.com/users/vetoshko/received_events","type":"User","site_admin":false},"repo":{"id":43541862,"name":"verstka-tasks-1","full_name":"vetoshko/verstka-tasks-1","owner":{"login":"vetoshko","id":5564166,"avatar_url":"https://avatars.githubusercontent.com/u/5564166?v=3","gravatar_id":"","url":"https://api.github.com/users/vetoshko","html_url":"https://github.com/vetoshko","followers_url":"https://api.github.com/users/vetoshko/followers","following_url":"https://api.github.com/users/vetoshko/following{/other_user}","gists_url":"https://api.github.com/users/vetoshko/gists{/gist_id}","starred_url":"https://api.github.com/users/vetoshko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vetoshko/subscriptions","organizations_url":"https://api.github.com/users/vetoshko/orgs","repos_url":"https://api.github.com/users/vetoshko/repos","events_url":"https://api.github.com/users/vetoshko/events{/privacy}","received_events_url":"https://api.github.com/users/vetoshko/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/vetoshko/verstka-tasks-1","description":"Задача к лекции «HTML, I часть»","fork":true,"url":"https://api.github.com/repos/vetoshko/verstka-tasks-1","forks_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/forks","keys_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/keys{/key_id}","collaborators_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/teams","hooks_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/hooks","issue_events_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/issues/events{/number}","events_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/events","assignees_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/assignees{/user}","branches_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/branches{/branch}","tags_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/tags","blobs_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/git/refs{/sha}","trees_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/git/trees{/sha}","statuses_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/statuses/{sha}","languages_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/languages","stargazers_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/stargazers","contributors_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/contributors","subscribers_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/subscribers","subscription_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/subscription","commits_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/commits{/sha}","git_commits_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/git/commits{/sha}","comments_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/comments{/number}","issue_comment_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/issues/comments{/number}","contents_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/contents/{+path}","compare_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/compare/{base}...{head}","merges_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/merges","archive_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/downloads","issues_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/issues{/number}","pulls_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/pulls{/number}","milestones_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/milestones{/number}","notifications_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/labels{/name}","releases_url":"https://api.github.com/repos/vetoshko/verstka-tasks-1/releases{/id}","created_at":"2015-10-02T08:04:45Z","updated_at":"2015-10-02T08:04:46Z","pushed_at":"2015-10-04T21:19:35Z","git_url":"git://github.com/vetoshko/verstka-tasks-1.git","ssh_url":"git@github.com:vetoshko/verstka-tasks-1.git","clone_url":"https://github.com/vetoshko/verstka-tasks-1.git","svn_url":"https://github.com/vetoshko/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":"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-05T04:39:09Z","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":48,"forks":81,"open_issues":48,"watchers":15,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/54"},"html":{"href":"https://github.com/urfu-2015/verstka-tasks-1/pull/54"},"issue":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/issues/54"},"comments":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/issues/54/comments"},"review_comments":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/pulls/54/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/54/commits"},"statuses":{"href":"https://api.github.com/repos/urfu-2015/verstka-tasks-1/statuses/b6717e802e18a9839844b2f266e43909edc55356"}}}}