diff --git a/interview/rails.md b/interview/rails.md index db53535..e6f4be3 100644 --- a/interview/rails.md +++ b/interview/rails.md @@ -557,6 +557,10 @@ 1. Что такое проблема N+1 запроса? +
+ Ответ + Эта проблема появляется при подгрузке дочерних обьектов, если мы используем ассоциацию ( many в one-to-many ). Множество ORM, по умолчанию, используют ленивую загрузку, т.е. делается запрос на выборку одной записи для родительского обьекта и запрос для КАЖДОЙ дочерней записи. Если коротко, то делая N+1 запрос вы в разы сильнее нагружаете базу данных, там, где этого можно избежать. +
1. Как можно решить проблему N+1 в Rails?
@@ -589,6 +593,7 @@ ``` http://rusrails.ru/active-record-query-interface#neterpelivaya-zagruzka-svyazey + https://engineering.gusto.com/a-visual-guide-to-using-includes-in-rails/ -- хорошая статья на тему, подробная графическая разбивка
1. Как без рендеринга шаблона сказать мобильному приложению, что у него нет прав на просмотр определённого контента одной строкой в контроллере? diff --git a/interview/webdev.md b/interview/webdev.md index 5aa1828..bb7d156 100644 --- a/interview/webdev.md +++ b/interview/webdev.md @@ -2,46 +2,47 @@ 1. Что происходит после того, как вы вводите название сайта в браузер и нажимаете Enter? Подробно объяснить.
- Ответ - -#### *1. Парсинг URL - можно отнести к условно первому этапу (не считая самого процесса ввода символов в поисковом поле браузера), во время которого*: -- Браузер проверяет список предзагруженных HSTS (HTTP Strict Transport Security). Это список сайтов, которые требуют, чтобы к ним обращались только по HTTPS. Если нужный сайт есть в этом списке, то браузер отправляет ему запрос через HTTPS вместо HTTP. В противном случае, начальный запрос посылается по HTTP. -- Конвертируются не-ASCII Unicode символы в название хоста. - -#### *2. Следующий этап - Определение DNS* -- Браузер проверяет наличие домена в своём кэше. Если домена там нет, то браузер вызывает библиотечную функцию *gethostbyname* (отличается в разных ОС) для поиска нужного адреса в файле *hosts*. -- Если домен нигде не закэширован и отсутствует в файле hosts, gethostbyname отправляет запрос к сетевому DNS-серверу. -- Запрос к сетевому DNS-серверу называется ARP-запросом. -- Для того, чтобы отправить ARP-запрос браузеру необходимо отыскать целевой IP-адрес, а также знать MAC-адрес интерфейса, который будет использоваться для отправки ARP-запроса. - -#### *3. Открытие сокета и сборка TCP-сегмента/пакета* -- Когда браузер получает IP-адрес конечного сервера, то он берёт эту информацию и данные об используемом порте из URL (80 порт для HTTP, 443 для HTTPS), осуществляет вызов функции socket системной библиотеки и запрашивает поток TCP сокета. -- Этот запрос сначала проходит через транспортный уровень, где собирается TCP-сегмент. Получившийся сегмент отправляется на сетевой уровень, на котором добавляется дополнительный IP-заголовок, IP-адрес сервера назначения и адрес текущей машины — теперь сегмент сформирован. - -#### *4. TLS handshake — для передачи пакетов данных между клиентом (компьютером) и сервером важно установить TCP-соединение. Это соединение устанавливается с помощью процесса, называемого трехсторонним рукопожатием TCP / IP, реализованного следующим образом*: - -- Клиентская машина отправляет SYN-пакет на сервер, спрашивая, открыт ли он для новых подключений. -- Если на сервере есть открытые порты, которые могут принимать и инициировать новые соединения, он ответит, используя пакет SYN / ACK. -- Клиент получит пакет SYN / ACK от сервера и подтвердит его, отправив пакет ACK. - -#### *5. Обработка HTTP-запросов на сервере* -- Одним из инструментов обработки запросов/ответов на стороне сервера является HTTPD. Наиболее популярные HTTPD-серверы это Apache или Nginx для Linux и IIS для Windows. -- Сервер разбирает запрос по следующим параметрам: метод HTTP-запроса (наиболее распространенные — GET/POST), домен, запрашиваемые пути. -- Сервер находит контент, который соответствует запросу и парсит файл с помощью обработчика. - -#### *6. Парсинг HTML и интерпретация CSS* -- Главной задачей HTML-парсера является разбор разметки в специальное дерево — «parse tree» — это дерево DOM-элементов. -- Во время разбора браузер парсит CSS-файлы, каждый из которых разбирается в объект StyleSheet. - -#### *7. Рендеринг страниц и пост-рендеринговое исполнение* -- Путём перебора DOM-узлов и вычисления для каждого узла значений CSS-стилей создаётся «Дерево рендера» (Render Tree или Frame Tree). -- Вычисляются координаты каждого узла. Вычисляются финальные позиции слоёв и через Direct3D/OpenGL отдаются композитные команды. -- После завершения рендеринга, браузер исполняет JavaScript-код в результате срабатывания часового механизма или в результате действий пользователя. - -#### *Для более детального ознакомления:* -- https://habr.com/ru/company/htmlacademy/blog/254825/ -- https://github.com/alex/what-happens-when -- https://medium.com/@maneesha.wijesinghe1/what-happens-when-you-type-an-url-in-the-browser-and-press-enter-bb0aa2449c1a + Ответ + + #### *1. Парсинг URL - можно отнести к условно первому этапу (не считая самого процесса ввода символов в поисковом поле браузера), во время которого*: + - Браузер проверяет список предзагруженных HSTS (HTTP Strict Transport Security). Это список сайтов, которые требуют, чтобы к ним обращались только по HTTPS. Если нужный сайт есть в этом списке, то браузер отправляет ему запрос через HTTPS вместо HTTP. В противном случае, начальный запрос посылается по HTTP. + - Конвертируются не-ASCII Unicode символы в название хоста. + + #### *2. Следующий этап - Определение DNS* + - Браузер проверяет наличие домена в своём кэше. Если домена там нет, то браузер вызывает библиотечную функцию *gethostbyname* (отличается в разных ОС) для поиска нужного адреса в файле *hosts*. + - Если домен нигде не закэширован и отсутствует в файле hosts, gethostbyname отправляет запрос к сетевому DNS-серверу. + - Запрос к сетевому DNS-серверу называется ARP-запросом. + - Для того, чтобы отправить ARP-запрос браузеру необходимо отыскать целевой IP-адрес, а также знать MAC-адрес интерфейса, который будет использоваться для отправки ARP-запроса. + + #### *3. Открытие сокета и сборка TCP-сегмента/пакета* + - Когда браузер получает IP-адрес конечного сервера, то он берёт эту информацию и данные об используемом порте из URL (80 порт для HTTP, 443 для HTTPS), осуществляет вызов функции socket системной библиотеки и запрашивает поток TCP сокета. + - Этот запрос сначала проходит через транспортный уровень, где собирается TCP-сегмент. Получившийся сегмент отправляется на сетевой уровень, на котором добавляется дополнительный IP-заголовок, IP-адрес сервера назначения и адрес текущей машины — теперь сегмент сформирован. + + #### *4. TLS handshake — для передачи пакетов данных между клиентом (компьютером) и сервером важно установить TCP-соединение. Это соединение устанавливается с помощью процесса, называемого трехсторонним рукопожатием TCP / IP, реализованного следующим образом*: + + - Клиентская машина отправляет SYN-пакет на сервер, спрашивая, открыт ли он для новых подключений. + - Если на сервере есть открытые порты, которые могут принимать и инициировать новые соединения, он ответит, используя пакет SYN / ACK. + - Клиент получит пакет SYN / ACK от сервера и подтвердит его, отправив пакет ACK. + + #### *5. Обработка HTTP-запросов на сервере* + - Одним из инструментов обработки запросов/ответов на стороне сервера является HTTPD. Наиболее популярные HTTPD-серверы это Apache или Nginx для Linux и IIS для Windows. + - Сервер разбирает запрос по следующим параметрам: метод HTTP-запроса (наиболее распространенные — GET/POST), домен, запрашиваемые пути. + - Сервер находит контент, который соответствует запросу и парсит файл с помощью обработчика. + + #### *6. Парсинг HTML и интерпретация CSS* + - Главной задачей HTML-парсера является разбор разметки в специальное дерево — «parse tree» — это дерево DOM-элементов. + - Во время разбора браузер парсит CSS-файлы, каждый из которых разбирается в объект StyleSheet. + + #### *7. Рендеринг страниц и пост-рендеринговое исполнение* + - Путём перебора DOM-узлов и вычисления для каждого узла значений CSS-стилей создаётся «Дерево рендера» (Render Tree или Frame Tree). + - Вычисляются координаты каждого узла. Вычисляются финальные позиции слоёв и через Direct3D/OpenGL отдаются композитные команды. + - После завершения рендеринга, браузер исполняет JavaScript-код в результате срабатывания часового механизма или в результате действий пользователя. + + #### *Для более детального ознакомления:* + - https://habr.com/ru/company/htmlacademy/blog/254825/ + - https://github.com/alex/what-happens-when + - https://medium.com/@maneesha.wijesinghe1/what-happens-when-you-type-an-url-in-the-browser-and-press-enter-bb0aa2449c1a + - https://medium.com/launch-school/demystifying-ruby-applications-ruby-application-servers-and-web-servers-c3d0fd415cb3
1. Что такое сессия? Для чего используется?