Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updates for webdevdao, sections webdev and rails #91

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions interview/rails.md
Original file line number Diff line number Diff line change
Expand Up @@ -557,6 +557,10 @@
</details>

1. Что такое проблема N+1 запроса?
<details>
<summary>Ответ</summary>
Эта проблема появляется при подгрузке дочерних обьектов, если мы используем ассоциацию ( many в one-to-many ). Множество ORM, по умолчанию, используют ленивую загрузку, т.е. делается запрос на выборку одной записи для родительского обьекта и запрос для КАЖДОЙ дочерней записи. Если коротко, то делая N+1 запрос вы в разы сильнее нагружаете базу данных, там, где этого можно избежать.
</details>
1. Как можно решить проблему N+1 в Rails?

<details>
Expand Down Expand Up @@ -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/ -- хорошая статья на тему, подробная графическая разбивка
</details>

1. Как без рендеринга шаблона сказать мобильному приложению, что у него нет прав на просмотр определённого контента одной строкой в контроллере?
Expand Down
81 changes: 41 additions & 40 deletions interview/webdev.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,46 +2,47 @@

1. Что происходит после того, как вы вводите название сайта в браузер и нажимаете Enter? Подробно объяснить.
<details>
<summary>Ответ</summary>
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Верните как было, для маркдауна не нужно делать отступы (и может потенциально не понравится некоторым парсерам).


#### *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
<summary>Ответ</summary>

#### *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
</details>

1. Что такое сессия? Для чего используется?
Expand Down