Ответы на вопросы компания MindK на тему SQL

❏ Понимаю ,что такое реляционные базы данных и в чем отличия от нереляционных.
Это набор данных с предопределенными связями между ними

❏ Знаю, что такое 3-я нормальная форма.
Каждый столбец, не являющийся ключом, должен зависеть только от столбца, который является ключом

❏ Знаю, что такое view и когда их лучше применять.
Это представление или виртуальная таблица. Объект базы данных, являющийся результатом выполнения запроса к базе данных, определенного с помощью оператора SELECT, в момент обращения к представлению. Представления иногда называют «виртуальными таблицами».  Можно менять структуру данных, не затрагивая программный код, нужно лишь создать представления, аналогичные таблицам, к которым раньше обращались приложения.

❏ Знаю, что такое временная таблица и когда ее применять.

Временные таблицы используются для хранения промежуточных данных при сложных выборках из БД, например при большом количестве JOIN и UNION запросов. Созданные таблицы доступны до закрытия соединения.

❏ Знаю когда нужно применять varchar, а когда text.
TEXT имеет фиксированный максимальный размер 65535 символов. В него нельзя поместить индекс кроме полнотекстового.
VARCHAR имеет переменную максимальный размер

❏ Знаю, что такое транзакции и для чего они нужны.

BEGIN;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;

В случае не выполнения части транзакции она откатывается до начального состояния.

❏ Знаю, как работает блокировка в MyISAM и InnoDB.
MyISAM (используемом по умолчанию) реализована табличная блокировка
InnoDB построчная

❏ Понимаю, что такое trigger и знаю когда его использовать.

Триггер в MySQL — это определяемая пользователем SQL-команда, которая автоматически вызывается во время операций INSERT , DELETE или UPDATE . Код триггера связан с таблицей и уничтожается после удаления таблицы.

CREATE TRIGGER update_test AFTER INSERT ON test
FOR EACH ROW BEGIN
INSERT INTO log Set msg = 'insert', row_id = NEW.id;
END;

❏ Кодил хранимые процедуры.

Хранимая процедура – это способ инкапсуляции повторяющихся действий. В хранимых процедурах можно объявлять переменные, управлять потоками данных, а также применять другие техники программирования

DELIMITER //  
  
CREATE PROCEDURE `p2` ()  
LANGUAGE SQL  
DETERMINISTIC  
SQL SECURITY DEFINER  
COMMENT 'A procedure'  
BEGIN  
    SELECT 'Hello World !';  
END//  

❏ Знаю для чего нужны индексы и принцип их работы.

MySql Index – это важный и полезный инструмент, который позволяет оптимизировать выборку из базы данных. Использование индексов значительно сокращает время выполнения запроса, что позволяет быстрее получать данные.
Ощутимую разницу при использовании MySql индексов можно увидеть при работе с таблицами крупных размеров.
Индекс представляет из себя структуру, в которой хранятся значения одного или нескольких столбца[ов] таблицы и ссылок на строки, где эти значения расположены. Для хранения индексов чаще всего используются “бинарные деревья”.

❏ Знаю в чем отличие primary key, unique и index.

Типы MySql индексов:

  • PRIMARY KEY – Первичный ключ: основной ключ, который позволяет хранить свои значения как уникальные записи таблицы. Данный тип ключа должен присутствовать в таблице в единственном экземпляре. Обычно данный тип ключа определяют колонке с наименованием id.
  • UNIQUE – Уникальный ключ: Частично похож на первичный ключ, за счет того, что значения колонки таблицы должны быть уникальными (не должны повторяться) и не должны быть равны NULL.
  • Составной индекс: данный тип индекса включает в индексирование несколько полей. Данный тип индексирования обычно используется в запросах, в которых необходимо произвести выборку по нескольким полям (там где в условии WHERE встречается более одного параметра).

❏ Понимаю, что такое полнотекстовый поиск.

1. Делится текст на отдельные слова, отбрасываются короткие и служебные слова.
2. Прогоняются слова через стемминг (отсекаются окончания)
3. По словам строится индекс

❏ Знаю последовательности применения операндов LIMIT, GROUP, ORDER.

GROUP ORDER LIMIT

❏ Знаю в чем разница применения операндов WHERE и HAVING.

Основное отличие WHERE от HAVING заключается в том, что WHERE сначала выбирает строки, а затем группирует их и вычисляет агрегатные функции (таким образом, она отбирает строки для вычисления агрегатов), тогда как HAVING отбирает строки групп после группировки и вычисления агрегатных функций.

❏ Знаю в чем отличие left join, inner join, right join, full join, cross join.

❏ Знаю агрегатные функции и как их использовать.
COUNT() – количество элементов, SUM() – сумма элементов, AVG() – срденнее, MAX() – максимальное, MIN() – минимальное значение.

❏ Могу спроектировать базу данных с двумя сущностями в отношении “многие ко многим”.

table1, table2, table1_to_table2

❏ Знаю как настроить права на таблицу для пользователя.

CREATE USER 'non-root'@'localhost' IDENTIFIED BY '123';
GRANT [тип прав] ON [имя базы данных].[имя таблицы] TO ‘non-root’@'localhost’;
FLUSH PRIVILEGES;


Ответы на вопросы компании MindK на тему PHP

❏ Знаю какие задачи решаются с помощью mod_rewrite.
Модуль Апач, служит для манипуляций над урлом

❏ Реализовывал 301-редирект с помощью mod_rewrite.

Redirect 301 /was.php http://www.site.ru/new.php

❏ Настраивал перенаправления для реализации единой точки входа в приложение с помощью mod_rewrite.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

❏ Знаю, что такое HTTP Authentication и настраивал ее.

AuthName "Текст выводится в окне авторизации"
AuthType Basic
AuthUserFile Полный путь/.htpasswd
require valid-user

❏ Знаю назначение магических методов и применял их на практике.

__construct() - этот метод запускается автоматически при созданнии экземпляра класса
__destruct() - метод запускается автоматически при уничтожении обьекта
__call(), __callStatic() - перехватывают обращение к несуществующему методу в контексте объекта и в статическом контексте
__get(), __set() - выполняется при чтении/записи данных из недоступных свойств
__isset() - будет выполнен при использовании isset() или empty() на недоступных свойствах
__unset() - будет выполнен при вызове unset() на недоступном свойстве
__sleep() - вызывается, когда объект подвергается сериализации при помощи функции serialize()
__wakeup() - вызывается при восстановлении объекта при помощи функции unserialize()
__toString() - метод, с помощью которого можно обращаться к классу как к строке
__invoke() - вызывается при попытке использовать объект в качестве функции
__set_state() - метод, который вызывается для классов, экспортирующих значения свойств функцией var_export()
__clone() - вызывается при клонировании объекта
__debugInfo() - метод вызывается функцией var_dump(), когда необходимо вывести список свойств объекта

❏ Понимаю и использовал в своей работе Iterator (из SPL).

SPL – Стандартная библиотека PHP

// Метод должен вернуть значение текущего элемента
public function current();
// Метод должен вернуть ключ текущего элемента
public function key();
// Метод должен сдвинуть "указатель" на следующий элемент
public function next(): void;
// Метод должен поставить "указатель" на первый элемент
public function rewind(): void;
// Метод должен проверять - не вышел ли указатель за границы?
public function valid(): bool

Строго говоря, итерироваться с помощью foreach нам позволяет интерфейс Traversable, а Iterator является его наследником. Особенность Traversable заключается в том, что его нельзя реализовать напрямую (этакий «абстрактный интерфейс») и пользоваться в своих приложениях нужно всё-таки интерфейсом Iterator или его «младшим братом» IteratorAggregate.

❏ Понимаю и использовал в своей работе ArrayObject (из SPL).
Чтобы объект вёл себя как массив, даёт доступ к данным через квадратные скобки и позволяет делать foreach

❏ Понимаю зачем нужна Reflection и могу привести практический пример применения.

class Child extends Profile {}
$class = new ReflectionClass('Child');
// получаем список всех родителей
print_r($class->getParentClass()); // ['Profile']

❏ Знаю новшества 7.
use Framework\Module{Foo, Bar, Baz};
$bar = $foo ?? ‘default’;
Оператор “космический корабль” <=>
типы скалярных параметров и подсказки (hints)
анонимные классы
и многое другое https://www.php.net/manual/ru/doc.changelog.php

❏ Понимаю зачем нужны анонимные функции и могу привести хотя бы 1 пример использования.

$greet = function($name) { printf("Привет, %s\r\n", $name); };

❏ Понимаю какую проблему решает Autoloading и умею написать свою реализацию.
Автозагрузка классов

function __autoload($className) {
  $filename = $className . ".php";
  if (is_readable($filename)) {
    require $filename;
  }
}

❏ Понимаю какую проблему решает паттерн Front Controller и могу реализовать его на практике.
Один контроллер обрабатывает все запросы к веб-сайту. Фронт-контроллер – это единая точка входа для вашего приложения.
www.example.com/index.php?article=3
www.example.com/index.php?user=4

❏ Понимаю какую проблему решает паттерн Page Controller и могу реализовать его на практике.

Паттерн, в котором один контроллер отвечает за отображение одной логической страницы. Это может быть как отдельная страница, хранящаяся на веб-сервере, так и отдельный объект, который отвечает за страницу.
www.example.com/article.php?id=3
www.example.com/user.php?id=4

❏ Понимаю какую проблему решает паттерн MVC и могу реализовать его на практике.
Модель – вид – контроллер

  • Контролёр указывает модели что нужно сделать.
  • Модель выполняет работу.
  • Вид отображает/отдаёт результат.

❏ Понимаю какую проблему решает паттерн HMVC и могу реализовать его на практике.
Иерархичекий – модель – вид – контроллер

Паттерн Иерархические-Модель-Вид-Контроллер (HMVC) является расширением MVC

❏ Знаю хотя бы один способ реализации роутинга в веб-приложении.
switch $_GET[‘action’] или parse_url

❏ Понимаю как обеспечить безопасную работу с входящим запросом и могу предложить варианты реализации. В частности, как предотвращать CSRF-атаки, XSS фильтр.
CSRF – внедрением токеонов, XSS – шифрование входных данных в сущности

❏ Знаю, что такое SQL-инъекции и могу обеспечить безопасную работу с БД.

Использовать PDO и фильтровать входящие данные

❏ Умею настроить нужный уровень ошибок.

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

❏ Знаю, как переопределить переменные окружения через htaccess/virt-hosts.

SetEnv Foo "bar"
echo $_SERVER["Foo"];

❏ Смогу найти все ссылки в тексте с помощью reg-выражений.

<a href="(.+?)">(.+?)</a>

❏ Работал с URL-библиотекой.

❏ Знаю, что такое сессия и как с ней работать. Могу реализовать свою ООП-реализацию.
session_set_save_handler('sess_open',
'sess_close',
'sess_read',
'sess_write',
'sess_destroy',
'sess_gb' );
session_start();

❏ Знаю, как дописать содержимое в файл средствами PHP.

file_put_contents($filename, $data, FILE_APPEND);

❏ Умею удалять файлы и директории из PHP.
Файлы — unlink, директории – rmdir

❏ Могу написать обработчик загрузки файла с html формы.

<form enctype="multipart/form-data" action="__URL__" method="POST">
    Отправить этот файл: <input name="userfile" type="file" />
    <input type="submit" value="Отправить файл" />
</form>
move_uploaded_file($_FILES['userfile']['tmp_name'], /dir/to/file.ext)

❏ Знаю как писать консольные скрипты на PHP.

#!/usr/bin/env php
<?php
printf('There were %d arguments passed to PHP:' . PHP_EOL, $argc);
print_r($argv);

❏ Умею построить работу с обработкой ошибок в приложении с использованием Exceptions.

try { } catch (Exception $e) {}

❏ Имею опыт реализации валидации входных данных.
FILTER_VALIDATE_ email domain int float ip Boolean url regexp url

❏ Имею опыт реализации загрузки файлов через форму.

move_uploaded_file($_FILES['userfile']['tmp_name'], /dir/to/file.ext)

❏ Знаю, что такое ACL и хотя бы раз реализовывал
Список управления доступом

❏ Знаю какие драйверы баз данных поддерживаются PHP с коробки.
Без модулией не поддерживает никакие базы данных. С модулями: sqlite, mongodb, myslq, mssql, maxdb, postgresql и другие.

❏ Использовал PDO.

<?php
try {
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    foreach($dbh->query('SELECT * from FOO') as $row) {
        print_r($row);
    }
    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

❏ Понимаю какую проблему решает ActiveRecord и имею опыт реализации.

Active Record обеспечивает объектно-ориентированный интерфейс для доступа и манипулирования данными, хранящимися в базах данных. Класс Active Record соответствует таблице в базе данных, объект Active Record соответствует строке этой таблицы, а атрибут объекта Active Record представляет собой значение отдельного столбца строки. Вместо непосредственного написания SQL-выражений вы сможете получать доступ к атрибутам Active Record и вызывать методы Active Record для доступа и манипулирования данными, хранящимися в таблицах базы данных.

$customer = new Customer();
$customer->name = 'Qiang';
$customer->save();

❏ Знаю плюсы и минусы DataMapper и ActiveRecord.

Оба эти паттерна предназначаются для преобразования данных из реляционного представления в объектное. Разница в том как они это делают и как они организованы, если в вкратце:
ActiveRecord – это объект, который хранит данные и содержит логику взаимодействия с БД.
Преимущества: простота, удобно использовать на небольших проектах.
Недостатки: паттерн нарушает множество принципов в частности Single Responsibility Principle, его использование как правило делает код сильно связанным, из за чего на сложных проектах его использовать невозможно.
DataMapper – объект хранящий логику взаимодействия с БД. Он не хранит данные как ActiveRecord
Преимущества: позволяет построить слабосвязанную архитектуру, разделить приложения на слои.
Недостатки: более сложный

❏ Имею практический опыт разработки на одном из современных фреймворков, таких как Laravel, Symfony, Yii, Zend.
Laravel https://laravel.com

Ответы на вопросы компания MindK на тему Git

  • Знаю, зачем нужна система контроля версий файлов и понимаю принцип ее работы.

Это набор консольных утилит, которые отслеживают и фиксируют изменения в файлах.  С его помощью вы можете откатиться на более старую версию вашего проекта, сравнивать, анализировать, сливать изменения и многое другое. Этот процесс называется контролем версий

  • Понимаю отличие архитектуры централизованной и распределенной системы контроля версий.

Централизованная система контроля версий предназначена для решения основной проблемы локальной системы контроля версий.

Для организации такой системы контроля версий используется единственный сервер, который содержит все версии файлов. Клиенты, обращаясь к этому серверу, получают из этого централизованного хранилища. Применение централизованных систем контроля версий на протяжении многих лет являлась стандартом. 

Для устранения единой точки отказа используются распределенные системы контроля версий. Они подразумевают, что клиент выкачает себе весь репозиторий целиком заместо выкачки конкретных интересующих клиента файлов. Если умрет любая копия репозитория, то это не приведет к потере кодовой базы, поскольку она может быть восстановлена с компьютера любого разработчика. Каждая копия является полным бэкапом данных.

  • Понимаю и использовал основные команды работы с репозиторием GIT (init, clone, commit, push, pull, fetch).
git init // инициализирует проэкт
git clone https://github.com/libgit2/libgit2 // клонирование существующего репозитория
git add * // добавить все файлы к индексированию
git commit // зафиксировать измененные файлы
git push <remote-name> <branch-name> // отправка изменений в удаленный репозиторий
git pull // автоматически получить изменения из удалённой ветки и слить их со своей текущей
git fetch [remote-name] // получение изменений из удалённого репозитория
  • Понимаю предназначение веток и использовал их в своей работе.

Это возможность открывать новый канал для особого набора изменений, например, для исправления бага, реализации новой фичи или каких-нибудь экспериментов — и все это без вреда для основной кодовой базы.

  • Сливал ветки через merge.

Предположим, вы работаете над проектом и уже имеете несколько коммитов.
Вы решаете, что теперь вы будете заниматься проблемой #53 из вашей системы отслеживания ошибок. Чтобы создать ветку и сразу переключиться на нее, можно выполнить команду git checkout с параметром -b:

$ git checkout -b hotfix
Switched to a new branch "hotfix"

Это то же самое что и:

$ git branch hotfix
$ git checkout hotfix

Вы работаете над своим сайтом и делаете коммиты.

$ git commit -a -m 'Create hotfix'
$ git checkout master
Switched to branch 'master'
git merge hotfix
  • Знаю применение команды stash + использовал её на практике.

Команда git stash позволяет на время «сдать в архив» (или отложить) изменения, сделанные в рабочей копии, чтобы вы могли применить их позже. Откладывание изменений полезно, если вам необходимо переключить контекст и вы пока не готовы к созданию коммита.

git stash    
git stash list    
git stash apply    

Отложенные изменения сохраняются в локальном репозитории Git и не передаются на сервер при выполнении команды push.

  • Реализовывал конфликты.

 Если разработчик A попытается изменить код, который редактирует разработчик B, может произойти конфликт. Основная задача команды git merge заключается в слиянии отдельных веток и разрешении любых конфликтующих правок.

  • Пересаживал цветы коммиты.

Команда git cherry-pick берёт изменения, вносимые одним коммитом, и пытается повторно применить их в виде нового коммита в текущей ветке. Эта возможность полезна в ситуации, когда нужно забрать парочку коммитов из другой ветки, а не сливать ветку целиком со всеми внесенными в нее изменениями.

  • Использовал команду rebase для перезаписи истории.

git rebase — это «автоматизированный» cherry-pick. Он выполняет ту же работу, но для цепочки коммитов, тем самым как бы перенося ветку на новое место.

  • Знаю, как изменить последний коммит.
git commit --amend

Ответы на вопросы компания MindK на тему HTML/CSS

  • Понимаю принцип каскадности таблиц стилей.

Это механизм, благодаря которому к элементу HTML-документа может применяться более чем одно правило CSS

  • Знаю основные HTML-элементы, такие как:span, div, ul, ol, thead, tfoot, p, a, и применял их на практике.
span – строчный элемент
div – блочный элемент
ul – список
ol – нумерованный список
thead – шапка таблицы
tfoot – футер таблицы
p – абзац
a - ссылка
  • Владею CSS-селекторами и понимаю, как они работают, такими как: #id.class; .class + .class; .class ~ div[attr], .div:not(:checked), div[attr*=”lorem”].
#id.class – выбираем в ид такой-то класc
.class + .class – выбрать элементы class внутри первого class
.class ~ div[attr] – выбрать все блоки div[attr] одного родителя class
.div:not(:checked) – выбрать элементы с классом div которые не отмечены &lt;input class=div type=checkbox /&gt;
div[attr*=”lorem”] – выбираем блок с атрибутом который содержит текст lorem
  • Понимаю как определяется приоритетность/вес CSS-селекторов.
*                                 	0-0-0-0 
li                                  0-0-0-1             
li:first-line                     	0-0-0-2             
ul li                              	0-0-0-2             
ul ol+li                          	0-0-0-3 
form + *[type=text]        			0-0-1-1 
table tr td.second         			0-0-1-3             
h2.block.title.               		0-0-2-1 
#xyz                             	0-1-0-0             
style=" "                       	1-0-0-0  
  • Проверял верстку на валидность, знаю основные правила валидного HTML, использовал средства валидации и знаю обязательные атрибуты HTML элементов.

https://validator.w3.org/ . Обязательные атрибуты это !DOCTYPE, html, head, title, body.

  • Применял на практике HTML5 элементы и знаю их назначение, такие как: article, aside, footer, header, nav, section.
article - задает содержание сайта вроде новости, статьи, записи блога, форума или др.
aside - определяет блок сбоку от контента для размещения рубрик, ссылок на архив
footer – определяет подвал сайта
header – определяет шапку сайта
nav – определяет навигацию сайта
section - задаёт раздел документа, может применяться для блока новостей, контактной информации и др.
  • Применял на практике CSS3 свойства, такие как: box-sizing,  animation, transform, translate.

box-sizing – применяется для изменения алгоритма расчета ширины и высоты элемента ( border-box – по границе, content-box – по контенту )

transform – трансформирует элемент, в частности, позволяет его масштабировать, вращать, сдвигать, наклонять, а также комбинировать виды трансформаций

translate – одна из функций transform, позволяет перемещать элемент.

  • Использовал на практике хотя бы один из подходов clearfix, знаю зачем они нужны и как работают.

Это способ борьбы с проблемой контейнера нулевой высоты для плавающих элементов

.clearfix:after {
   content: " "; /* Older browser do not support empty content */
   visibility: hidden;
   display: block;
   height: 0;
   clear: both;
}
  • Реализовывал тянущуюся верстку, знаю принципы и возможные проблемы.
.col1 { left: 0; right: 50%; margin-right: 100px; }
.col2 { width: 200px; left: 50%; margin-left: -100px; }
.col3 { left: 50%; right: 0; margin-left: 100px; }

Тянущуюся верстку можно делать: таблицами, блоками, гридами, флексами.

  • Работал с адаптивной версткой, знаю принципы, использовал инструменты для тестирования и отладки.

Ctrl+Shift+I

  • Знаю один из markup frame work (Bootstrap CSS / Compass CSS / Foundation CSS Material UI / Semantic UI / Знакомство с LESS, SASS).

https://getbootstrap.com/

sass – препроцессор css

Scroll Up