Результати пошуку
ITVDN: курси програмування
Відеокурси з
програмування
Підписка

300+ курсів за популярними IT-напрямками

Вибери свою IT спеціальність

Підписка
Підписка

300+ курсів за популярними IT-напрямками

Результати пошуку за запитом: обучение c*
ТОП 20 тестових завдань на інтерв'ю для Java розробника

Автор: Армен Маїлян

Напишіть програму на Java для перевертання рядка, змінивши розташування символів у рядку задом наперед без використання вбудованих в String функцій Напишіть програму на Java для перевороту послідовності символів у рядку без використання вбудованої в String функції reverse() Напишіть програму на Java для того, щоб поміняти місцями значення, що зберігаються у двох змінних за допомогою третьої змінної Напишіть програму на Java, щоб поміняти місцями значення, що зберігаються у двох змінних, без використання третьої змінної Напишіть програму Java для підрахунку кількості конкретних слів у рядку, використовуючи HashMap Напишіть Java-програму для ітерації об'єкта типу HashMap з використанням циклу while та покращеного циклу for Напишіть програму на Java, щоб дізнатися, чи є число простим, чи ні Напишіть Java-програму, щоб визначити, чи є рядок або число паліндромом, чи ні Написати програму на Java для обчислення серії чисел Фібоначчі Напишіть Java-програму для обходу ArrayList з використанням циклу for, while та покращеного циклу for Напишіть програму на Java, щоб продемонструвати явну перевірку умов очікування Напишіть Java-програму для демонстрації прокручування вгору / вниз Напишіть програму на Java, щоб відкрити усі посилання на gmail.com Напишіть код для Selenium, щоб перейти до попередньої вкладки Напишіть програму на Java, щоб знайти повторювані символи в рядку Напишіть Java-програму, щоб знайти друге за величиною число в масиві Напишіть Java-програму для перевірки, чи є введене число числом Армстронга Напишіть Java-програму для видалення всіх пробілів з рядка за допомогою replace() Напишіть Java-програму для видалення всіх пробілів з рядка без використання replace() Напишіть Java-програму для читання даних із таблиці Excel У цій статті ми наведемо досить багато прикладів програм з тих, що просять написати претендентів під час проходження інтерв'ю на вакансію Java розробника. Вказані тестові завдання ми наводимо з реальними прикладами коду, заданими в інтерв'ю як початківцям, так і досвідченим кандидатам. Сьогодні серед інтерв'юерів стало звичайною практикою давати тестові практичні завдання під час інтерв'ю, не фокусуючись лише на теоретичних питаннях. Такі завдання зазвичай задають на технічному етапі інтерв'ю Java розробника. Для того, щоб допомогти претендентам на відповідні вакансії пройти такі інтерв'ю, ми хочемо перерахувати кілька дуже важливих прикладів програм на Java разом з належним описом кожного. Крім того, ми також додаємо відповідні пояснення коду. Ці пояснення дадуть вам чітке уявлення, як працює кожна програма.   Найпопулярніші питання інтерв’ю Java-програмування. Q # 1) Напишіть програму на Java для перевертання рядка, змінивши розташування символів у рядку задом наперед без використання вбудованих в String функцій.   Відповідь: Для початку ініціалізуємо рядкову змінну st і використовуємо клас StringBuilder. Об'єкт класу StringBuilder strB буде надалі використовуватися для додавання значення, що зберігається в рядковій змінній st. Після цього ми використовуємо вбудовану в StringBuilder функцію reverse() і зберігаємо нову – обернений рядок в stB. Нарешті ми виводимо на екран stB. public class FirstTask{             public static void main(String[] args) {                         // ITVDN.com 1 із ТОП 20 тестових завдань на інтерв’ю для Java розробника                         String st = "Задача1";                         StringBuilder stB = new StringBuilder();                         stB.append(st);                         stB = stB.reverse();     // використовуємо StringBuilder для перевороту рядку                         System.out.println(stB);             } } На екрані отримаємо: 1ачадаЗ   Q # 2) Напишіть програму на Java для перевороту послідовності символів у рядку без використання вбудованої в String функції reverse().   Відповідь Спосіб 1: Є кілька способів, за допомогою яких ви можете перевернути ваш рядок, якщо вам дозволено використовувати інші вбудовані функції рядка. У цьому способі ми ініціалізуємо рядкову змінну з ім'ям st значенням заданого рядка. Потім ми конвертуємо цей рядок у масив символів за допомогою функції toCharArray(). Після цього ми використовуємо цикл for, щоб взяти всі символи у зворотному порядку і вивести їх так на екран по черзі. public class SecondTask {             public static void main(String[] args) {            //ITVDN.com 2 з ТОП 20 тестових завдань на інтерв’ю для Java розробника            String st = "Вчимося програмувати";                char symbols[] = st.toCharArray();  // конвертуємо рядок у масив символів, потім виводимо символи на екран у зворотному порядку            for(int x= symbols.length-1; x>=0; x--) {                         System.out.print(symbols [x]);            }       } } На екрані отримаємо: итавумаргорп ясомичВ Спосіб 2: Це ще один спосіб виконати завдання з переворотом послідовності символів у рядку. У цьому способі ви оголошуєте рядкову змінну st, а потім використовуєте клас Scanner, оголошуючи об'єкт scannerQ для роботи зі стандартним потоком введення даних. У цьому випадку програма набуде рядкового значення через командний рядок (при його виконанні). Далі ми використовували метод nextLine(), який прочитав наш рядок під час введення його через консоль з пробілами між словами рядка. Після цього ми використовували метод split() для поділу рядка на його підрядки (тут не вказується роздільник). Потім ми виводимо рядок у зворотному порядку, використовуючи цикл for. import java.util.Scanner; public class SecondTask {             public static void main(String[] args) {            // ITVDN.com 2 з ТОП 20 тестових завдань на інтерв’ю для Java розробника            String st;            Scanner scannerQ = new Scanner(System.in);            System.out.println("Введіть ваш рядок:");            st = scannerQ.nextLine();            String[] temp = st.split("");       //використовуємо метод split для виведення рядку в зворотньому порядку            for(int x= temp.length-1; x>=0; x--)            {                         System.out.print(temp [x] + "");            }                     } } На екрані отримаємо: Введіть ваш рядок: asfasdf aasdfasdfadsf fsdafdsafdsaa fdsafsa Спосіб 3: Це спосіб майже такий, як спосіб 2, але тут ми не використовуємо метод split(). Ми використовуємо клас Scanner та метод nextLine() для читання вхідного рядка. Потім ми оголосили цілочисельну змінну stringLength, присвоюючи їй значення довжини вхідного рядка. Після цього ми вивели рядок у зворотному порядку, використовуючи цикл for. Однак ми використовували метод charAt(index), який повертатиме символ за конкретним індексом. Після кожної ітерації символ буде додано до нового рядка для отримання перевернутого значення рядкової змінної. Потім ми виводимо змінну перевернутого рядка. import java.util.Scanner; public class SecondTask {             public static void main(String[] args) {            // ITVDN.com 2 з ТОП 20 тестових завдань на інтерв’ю для Java розробника            String mainString, reverseString = "";            System.out.println("Введіть рядок, щоб отримати перевернутий:");            Scanner scannerQ = new Scanner(System.in);            mainString = scannerQ.nextLine();            int stringLength = mainString.length();            for(int x= stringLength -1; x>=0; x--) {                        reverseString = reverseString + mainString.charAt(x);   //використовуємо вбудований метод charAt(), щоб перевернути рядок            }            System.out.println(reverseString);             } } На екрані отримаємо: Введіть рядок, щоб отримати перевернутий: Введений рядок кодяр йинедевВ   Q # 3) Напишіть програму на Java для того, щоб поміняти місцями значення, що зберігаються у двох змінних за допомогою третьої змінної   Відповідь: У цьому прикладі ми створюємо об'єкт класу Scanner для роботи зі стандартним потоком даних System.in. Ця програма прийматиме значення a та b через командний рядок. Ми використали nextInt(), який буде поміщати введені користувачем значення цілочисельних змінних в a і b. Також оголошуємо тимчасову змінну. Тепер логіка програми виглядає наступним чином: ми створюємо тимчасову або третю змінну з ім'ям temp, присвоюємо їй значення, що зберігається в змінній a, а потім присвоюємо значення b, і знову присвоюємо b значення temp. Таким чином, після виконання всіх операцій temp буде зберігати в собі значення a, a отримає значення b, а b матиме значення temp (яке дорівнює a).   import java.util.Scanner; public class ThirdTask {             public static void main(String[] args) {            // ITVDN.com 3 з ТОП 20 тестових задач на інтерв’ю для Java розробника            int a, b, temp;            System.out.println("Введіть значення a та b");            Scanner scannerQ = new Scanner(System.in);            a = scannerQ.nextInt();            b = scannerQ.nextInt();            System.out.println("До обміну значеннями " + a + b);            temp = a;            a = b;            b = temp;            System.out.println("Після обміну значеннями " + a + b);                          } }   На екрані отримаємо: Введіть значення a і b 23 45 До обміну значеннями 2345 Після обміну значеннями 4523   Q # 4) Напишіть програму на Java, щоб змінити місцями значення, що зберігаються у двох змінних, без використання третьої змінної.   Відповідь: Спочатку все буде так само, як і в наведеному вище прикладі. Лише подальша логіка зміниться. Тут ми спочатку присвоюємо змінній a значення a + b, что означає, що a буде тепер мати в собі значення як a, так і b. Потім ми присвоюємо змінній b значення a - b, що означає, що ми віднімаємо значення b із суми (a + b). Досі a все ще зберігає у собі суму початкових a і b. Але b має тепер значення первісного a. Нарешті, на третьому кроці ми присвоюємо a значення a - b, що означає, що ми віднімаємо значення змінної b (яка зараз вже має в собі значення a) із суми (a + b). В результаті цих дій ми змінили місцями значення, які зберігаються у змінних.   import java.util.Scanner; public class FourthTask {    public static void main(String args[])    {             int a, b;             System.out.println("Введіть потрібні значення a та b");             Scanner scannerQ = new Scanner(System.in);             a = scannerQ.nextInt();             b = scannerQ.nextInt();             System.out.println("До обміну значеннями\na = "+a+"\nb = "+b);             a = a + b;             b = a - b;             a = a - b;             System.out.println("Після обміну значеннями без проміжної змінної\na = "+a+"\nb = "+b);    } }   На екрані отримаємо: Введіть потрібні значення a та b 23 45 До обміну значеннями a = 23 b = 45 Після обміну значеннями без проміжної змінної a = 45 b = 23   Q # 5) Напишіть програму Java для підрахунку кількості конкретних слів у рядку, використовуючи HashMap.   Відповідь: Ця програма працює з класом-колекцією, в якій ми використовували HashMap для зберігання рядка. Насамперед, ми оголосили нашу рядкову змінну з іменем st. Потім ми використовували функцію split() з одиночним пробілом, щоб можна було розбити рядок на масив з декількох слів. Після цього ми створили екземпляр HashMap та цикл for. Всередині циклу for ми використовуємо оператор if else. Ми заходимо до кожного елементу масиву split та додаємо елементи цього масиву. Слова ми додаємо як ключі екземпляру HashMap. У якості значень HashMap ми будемо додавати те число, скільки разів при обході масиву слів нам це слово зустрілося. Якщо в наш екземпляр HashMap ми вже додали дане слово – при обході ми збільшимо значення, записане в HashMap відповідно до даного слова-ключа. Щоразу, коли слово буде зустрічатися повторно (ми бачимо, що слово в екземпляр HashMap ми вже додавали) – значення-лічильник збільшується на 1. Якщо таке слово раніше не зустрічалося – значення-лічильник встановлюється на 1. Зрештою, ми виводимо на екран HashMap. Зверніть увагу: ту ж програму можна використовувати і для підрахунку кількості символів у рядку. Все, що вам потрібно зробити, це видалити один пробіл (видалити пробіл, вказаний в методі split) і прописати String [] words = st.split (“”); import java.util.HashMap; public class FifthTask{             public static void main(String[] args) {            // ITVDN.com 5 з ТОП 20 тестових завдань на інтерв’ю для Java розробника            String st = "Current task posted for Java developers developers";            String[] words = st.split(" ");            HashMap<String,Integer> keyValue = new HashMap<String,Integer>();            for (int i=0; i<= words.length-1; i++) {                         if (keyValue.containsKey(words[i])) {                                     int counter = keyValue.get(words[i]);                                     keyValue.put(words[i], counter+1);                         }                         else {                                     keyValue.put(words[i], 1);                         }            }            System.out.println(keyValue);             } } На екрані отримаємо: {Java=1, task=1, developers=2, for=1, Current=1, posted=1}   Q # 6) Напишіть Java-програму для ітерації об'єкта типу HashMap з використанням циклу while та покращеного циклу for.   Відповідь: Тут ми спочатку вставили три елементи в змінну типу HashMap з ім'ям keyValue, використовуючи функцію put(). Розмір змінної keyValue можна одержати за допомогою методу size(). Після цього ми використовували цикл While для обходу keyValue, яка містить по одній парі ключ-значення для кожного елемента. Ключі та значення можуть бути отримані за допомогою методів getKey() та getValue(). Аналогічно ми використовуємо розширений цикл for, на елементах «qurentMe2» у HashMap. import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class SixthTask{             public static void main(String[] args) {            // ITVDN.com ТОП 20 тестових завдань на інтерв’ю для Java розробника            HashMap<Integer,String> keyValue = new HashMap<Integer,String>();            keyValue.put(1, "Hello");            keyValue.put(2, "World");            keyValue.put(3, "Have a nice day!");            System.out.println(keyValue.size());            System.out.println("Цикл While:");            Iterator iter = keyValue.entrySet().iterator();            while(iter.hasNext()) {                         Map.Entry qurentMe = (Map.Entry) iter.next();                         System.out.println("Ключ это " + qurentMe.getKey() + " Значення це " + qurentMe.getValue());            }            System.out.println("Цикл For:");            for(Map.Entry qurentMe2: keyValue.entrySet()) {                         System.out.println("Ключ це: " + qurentMe2.getKey() + " Значення це: " + qurentMe2.getValue());            }             } } На екрані отримаємо: 3 Цикл While: Ключ це 1 Значення це Hello Ключ це 2 Значення це World Ключ це 3 Значення це Have a nice day! Цикл For: Ключ це: 1 Значення це: Hello Ключ це: 2 Значення це: World Ключ це: 3 Значення це: Have a nice day!    Q # 7) Напишіть програму на Java, щоб дізнатися, чи є число простим, чи ні.   Відповідь: Ми оголосили дві цілочисельні змінні temp та number і використали клас Scanner з nextInt (оскільки у нас може бути на розгляді тільки ціле число). Оголошуємо логічну змінну numberIsPrime і встановлюємо її значення – true. Після цього ми використовуємо цикл for зі значенням змінної ітератора, що починається з 2. Кількість ітерацій, необхідне нам, дорівнюватиме половині введеного числа. Лічильник ітерацій збільшується на 1 після кожної ітерації. У змінну tempNumber ми поміщуватимемо залишок від поділу значення введеного числа на значення лічильника. Якщо залишок від поділу в одній з ітерацій дорівнюватиме 0, тоді numberIsPrime буде встановлений у false, введене число не буде простим, і ми виходимо з циклу. Якщо у всіх ітераціях ми отримуватимемо в temp деякі залишки від розподілу, відмінні від нуля – число буде простим. Ґрунтуючись на значенні numberIsPrime, ми приходимо до висновку, чи є наше число простим, чи ні. import java.util.Scanner; public class SeventhTask {             public static void main(String[] args) {            // ITVDN.com ТОП 20 тестових завдань на інтерв’ю для Java розробника            int temp, number;            boolean numberIsPrime = true;            Scanner scannerQ = new Scanner(System.in);            number = scannerQ.nextInt();            scannerQ.close();            for (int x = 2; x<= number /2; x++) {                         tempNumber = number %x;                                     if (tempNumber == 0) {                                     numberIsPrime = false;                                     break;                         }            }            if(numberIsPrime)                         System.out.println(number + " число є простим");                         else                                     System.out.println(number + " число не є простим");                      } } На екрані отримаємо: 27 27 число не є простим   Q # 8) Напишіть Java-програму, щоб визначити, чи є рядок або число паліндромом, чи ні.   Відповідь: Щоб перевірити, чи є число або рядок паліндромом, чи ні, ви можете використовувати будь-яку програму, що перевертає рядки, з описаних вище. Що вам потрібно зробити, то це додати один оператор if-else. Якщо вихідний рядок дорівнює перевернутому рядку, то число є паліндромом, інакше – ні. import java.util.Scanner; public class EighthTask{             public static void main (String[] args) {            // ITVDN.com ТОП 20 тестових завдань на інтерв’ю для Java розробника            String inputString, reversedString = "";            Scanner scannerQ = new Scanner(System.in);            int stringLength;            System.out.println("Введіть число або рядок");             inputString = scannerQ.nextLine();            stringLength = inputString.length();            for (int x = stringLength -1; x>=0; x--) {                         reversedString = reversedString + inputString.charAt(x);            }            System.out.println("перевернутое значение: " + reversedString);                         if(inputString.equals(reversedString))                         System.out.println("Введене значення є паліндромом");            else                         System.out.println("Введене значення не є паліндромом");                          } } На екрані отримаємо: Для рядка- Введіть число або рядок dfggg перевернуте значення: gggfd Введене значення не є паліндромом Для числа- Введіть число або рядок 777 перевернуте значення: 777 Введене значення є паліндромом   Q # 9) Написати програму Java для обчислення серії чисел Фібоначчі.   Відповідь: Ряд Фібоначчі - це така серія чисел, де після перших двох чисел кожне число, яке зустрічається, є сумою двох попередніх чисел. Приклад: 0,1,1,2,3,5,8,13,21 ……… У цій програмі ми знову використали клас Scanner з nextInt (описувалося вище). Спочатку ми вводимо (через командний рядок) деяке число, яку кількість чисел Фібоначчі ми повинні отримати. Ми оголосили цілочисленні змінні number, x, y та z, ініціалізували x та y нулем, а z – одиницею. Потім ми використовували цикл for для ітерації. Процес рішення в циклі виглядає так – ми присвоюємо x значення, рівне y (яке в першій ітерації дорівнює 0), потім y присвоюємо значення змінної z (рівне у першій ітерації 1). Потім змінної z привласнюємо значення, що дорівнює сумі значень x та y. import java.util.Scanner; public class NinthTask{             public static void main(String[] args) {            // ITVDN.com 9 з ТОП 20 тестових завдань на інтерв’ю для Java розробника            int number, x = 0, y=0, z =1;            Scanner scannerQ = new Scanner(System.in);            System.out.println("Введіть кількість значень");            number = scannerQ.nextInt();            System.out.println("Серія чисел Фібоначчі: ");            for (int i=0; i<= number; i++) {                         x = y;                         y = z;                         z = x+y;                         System.out.println(x + "");       // якщо ви хочете вивести в поточному рядку – використовуйте print()            }                          } } На екрані отримаємо: Введіть кількість значень 10 Серія чисел Фібоначчі: 0 1 1 2 3 5 8 13 21 34 55   Q # 10) Напишіть Java-програму для обходу ArrayList з використанням циклу for, while та покращеного циклу for.   Відповідь: У цій програмі ми додали три елементи до ArrayList і вивели його розмір. Потім ми використовуємо цикл While з ітератором. Щоразу, коли ітератор отримує наступний елемент, він буде відображати цей елемент, доки ми не досягнемо кінця списку. У нашому випадку це повторюватиметься тричі. Аналогічно ми зробили для покращеного циклу for, де ми створили об'єкт o для ArrayList з ім'ям testList. Потім вивели на екран значення об'єкта. Після цього ми створили цикл for, де ітератор i встановлено спочатку на індекс 0, а потім збільшується на 1 при кожній ітерації, поки не буде досягнута межа ArrayList. Нарешті, ми виводимо на екран кожен елемент, використовуючи метод get(index) для кожної ітерації циклу for. import java.util.*; public class arrayList {             public static void main(String[] args) {            // ITVDN.com 10 з ТОП 20 тестових завдань на інтерв’ю для Java розробника            ArrayList testList = new ArrayList();            testList.add("50");            testList.add("60");            testList.add("70");            System.out.println(testList.size());            System.out.println("Цикл While:");            Iterator iter = testList.iterator();            while(iter.hasNext()) {                         System.out.println(iter.next());            }            System.out.println("Покращений цикл For:");            for(Object o : testList) {                         System.out.println(o);             }            System.out.println("Цикл For:");            for(int i=0; i< testList.size(); i++) {                         System.out.println(testList.get(i));            } } } На екрані отримаємо: 3 Цикл While: 50 60 70 Покращений цикл For: 50 60 70 Цикл For: 50 60 70   Q # 11) Напишіть програму Java, щоб продемонструвати явну перевірку умов очікування.   Відповідь: У Selenium є два основні типи очікування – неявне (Implicit Wait) і явне (Explicit Wait). (Ми не розглядаємо явне (вільне) очікування у цьому прикладі). Неявне очікування – оголошується один раз у коді поза операцією пошуку та діє до зміни. Це очікування виконується незалежно від будь-якої умови і застосовується до всіх наступних операцій пошуку неявно. У наведеній нижче програмі ви можете бачити застосування такого очікування для Google Chrome. Ми використовували кілька вбудованих методів для встановлення властивості, максимізації вікна, навігації по URL та пошуку веб-елементів. WebDriverWait waitWD = new WebDriverWait(curentDriver, 20); WebElement secondElement = waitWD.until(ExpectedConditions.visibilityOfElementLocated(By.partialLinkText("Тестування програмного забезпечення - Вікіпедія"))); secondElement.click(); У наведеному вище фрагменті коду можна побачити, що ми створили об'єкт waitWD для WebDriverWait, а потім ми здійснили пошук WebElement з ім'ям secondElement. Умову встановлено таким чином, що веб-драйверу доведеться чекати, поки ми не побачимо посилання «Тестування програмного забезпечення – Вікіпедія» на веб-сторінці. Команда не виконається, якщо не знайде це посилання. Якщо посилання буде знайдено, веб-драйвер виконає клацання мишею за цим посиланням. package Codes; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; public class EleventhTask{             public static void main(String[] args) {                         // ITVDN.com 11 з ТОП 20 тестових завдань на інтерв’ю для Java розробника                         System.setProperty("webdriver.chrome.driver", "C:\\driver\\chromedriver.exe");                         ChromeOptions cOptions = new ChromeOptions();                         cOptions.addArguments("--disable-arguments");                         WebDriver curentDriver = new ChromeDriver();                         curentDriver.manage().window().maximize();                         curentDriver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);                         curentDriver.navigate().to("https://www.google.com.ua");                         WebElement curentElement = curentDriver.findElement(By.name("q"));                         curentElement.sendKeys("Testing");                         curentElement.submit();                         WebDriverWait waitWD = new WebDriverWait(curentDriver, 20);                      WebElement secondElement = waitWD.until(ExpectedConditions.visibilityOfElementLocated(By.partialLinkText("Тестування програмного забезпечення – Вікіпедія"))); secondElement.click(); } }   Q # 12) Напишіть програму на Java для демонстрації прокручування вгору/вниз.   Відповідь: Усі рядки кодів легко співвідносяться з кодом попереднього прикладу. У код цієї програми ми включили JavascriptExecutor jscript, який виконуватиме прокручування. На останньому рядку коду ми передаємо window.scrollBy(argument1, argument2). Якщо нам потрібно виконати прокручування вгору, тоді передаємо деяке значення в argument1, якщо нам потрібно прокрутити вниз – передаємо деяке значення в argument2.   package Codes; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebElement; public class TwelfthTask{             public static void main(String[] args) {                         // ITVDN.com 12 з ТОП 20 тестових завдань на інтерв’ю для Java розробника                         System.setProperty("webdriver.chrome.driver", "C:\\driver\\chromedriver.exe");                         WebDriver qurentDriver = new ChromeDriver();                         JavascriptExecutor jscript = (JavascriptExecutor) qurentDriver;                         qurentDriver.manage().window().maximize();                         qurentDriver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);                         qurentDriver.get("https://www.google.com.ua");                         WebElement qurentElement = qurentDriver.findElement(By.name("q"));                         qurentElement.sendKeys("SoftwareTestingHelp");                         qurentElement.sendKeys(Keys.ENTER);                         jscript.executeScript("window.scrollBy(0,900)"); } }   Q # 13) Напишіть програму на Java, щоб відкрити всі посилання на gmail.com.   Відповідь: Це типовий приклад застосування покращеного циклу for, який ми бачили у наших попередніх прикладах. Після того, як ви відкрили веб-сайт, такий як Gmail, використовуючи get() або navigate().to(), ви можете використовувати локатор tagName, щоб отримати всі посилання на веб-сайті, які мають однакові теги. У нас є покращений цикл for, в якому ми обходимо всі знайдені посилання за нашим тегом. Для кожного посилання типу WebElement у нашому листі посилань ми отримуємо самі посилання через getAttribute(«href») і тексти через getText(). package Codes; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class ThirteenthTask{             public static void main(String[] args) {             // ITVDN.com 13 з ТОП 20 тестових завдань на інтерв’ю для Java розробника             System.setProperty("webdriver.chrome.drive", "C:\\driver\\chromedriver.exe");             WebDriver curentDriver = new ChromeDriver();             curentDriver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);             curentDriver.manage().window().maximize();             curentDriver.get("https://www.gmail.com/");             java.util.List<WebElement> linkList = curentDriver.findElements(By.tagName("a"));             System.out.println(linkList.size());             for (WebElement thisLink: linkList) {             //виводимо на екран посилання http://google.com або https://www.gmail.com             System.out.println(qurentLink.getAttribute("href"));             //виводимо на екран текст посилання             System.out.println(qurentLink.getText()); } } } На екрані отримаємо: Starting ChromeDriver 2.38.551601 (edb21f07fc70e9027c746edd3201443e011a61ed) on port 16163 Only local connections are allowed. 3 https://support.google.com/accounts?hl=ru Довідка https://policies.google.com/privacy?gl=IN&hl=ru Політика конфіденційності https://policies.google.com/terms?gl=IN&hl=ru Умови використання   Q # 14) Напишіть код для Selenium, щоб перейти на попередню вкладку.   Відповідь: Ми використовуємо клас Robot. Цей приклад досить важливий, тому що, якщо ви знаєте поєднання клавіш, ви можете використовувати різну навігацію в браузері та його вкладках. Наприклад, якщо у вас у Chrome відкрито три вкладки, і ви хочете перейти на середню вкладку, то вам потрібно натиснути + 2 на клавіатурі. Те саме можна досягти за допомогою коду. Використовуйте наступний код (відразу після того, як ми побачимо створення екземпляру класу Robot). Ми використовували об'єкт qurentRobot класу Robot, з двома вбудованими методами keyPress(KeyEvent.VK_*) та keyRelease(KeyEvent.VK_*). package Codes; import java.awt.AWTException; import java.awt.Robot; import java.awt.event.KeyEvent; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class FourteenthTask{             public static void main(String[] args) throws AWTException {            // ITVDN.com 14 з ТОП 20 тестових завдань на інтерв’ю для Java розробника             System.setProperty("webdriver.chrome.driver", "C:\\driver\\chromedriver.exe");             WebDriver curentDriver = new ChromeDriver();             curentDriver.manage().window().maximize();             curentDriver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);             curentDriver.get("https://www.google.com");             WebElement firstElement = curentDriver.findElement(By.name("q"));             firstElement.sendKeys("software testing help");             firstElement.sendKeys(Keys.ENTER);             String str = Keys.chord(Keys.CONTROL,Keys.RETURN);              curentDriver.findElement(By.partialLinkText("Software Testing Help - A Must Visit Software Testing Portal")).sendKeys(str);             Robot qurentRobot = new Robot(); // Ініціалізуємо екземпляр класу Robot              qurentRobot.keyPress(KeyEvent.VK_CONTROL); // застосовуючи клас Robot ви легко можете отримати необхідний результат, якщо ви знаєте потрібні комбінації кнопок             qurentRobot.keyPress(KeyEvent.VK_2); // тут ми натискаємо ctrl+2              qurentRobot.keyRelease(KeyEvent.VK_CONTROL); // як тільки ми натиснемо та відпустимо ctrl+2, ми перейдемо на другу вкладку.             qurentRobot.keyRelease(KeyEvent.VK_2); //якщо ви хочете знову повернутися до першої вкладки, натисніть і відпустіть vk_1             } }   Q # 15) Напишіть програму на Java, щоб знайти повторювані символи в рядку.   Відповідь: У цій програмі ми створюємо рядкову змінну st та ініціалізуємо цілочисельний лічильник, починаючи з нуля. Потім ми створили масив символів для перетворення нашої рядкової змінної на цей масив. За допомогою двох циклів for ми проводимо порівняння символів із різними індексами. Якщо два символи послідовного індексу збігаються, цей символ буде виведений на екран і лічильник кількості символів, що збігаються, збільшиться на 1.  public class FifteenTask{             public static void main(String[] args) {                         // ITVDN.com 15 з ТОП 20 тестових завдань на інтерв’ю для Java розробника                         String st = new String("Hello");                         int counter = 0;                         char[] charsArray = st.toCharArray();                         System.out.println("Повторювані символи тут:");                         for (int i=0; i<st.length();i++) {                                     for(int j=i+1; j<st.length();j++) {                                                 if (charsArray [i] == charsArray [j]) {                                                            System.out.println(charsArray [j]);                                                            counter ++;                                                      break;                                                }                                     }                         }             } } На екрані отримаємо: Повторювані символи тут: l   Q # 16) Напишіть Java-програму, щоб знайти друге за величиною число в масиві.   Відповідь: У цій програмі ми ініціалізували масив із 10 випадковими елементами, з яких ми збираємося знайти друге за величиною число. Далі ми створили дві цілочисельні змінні, яким присвоюватимемо значення двох цілих чисел з масиву – найбільшого і другого за величиною. Обидві змінні спочатку набувають значення першого за індексом елемента масиву. Потім ми виводимо на екран усі елементи, використовуючи цикл for. Подальша логіка роботи програми полягає в тому, щоб використовувати цикл for для обходу масиву. При обході, якщо елемент масива з поточним індексом більше, ніж значення, що зберігається в змінній biggest, тоді змінній secondBiggest присвоюємо значення, що зберігається в biggest, а змінній biggest – нове найбільше значення відповідно до значення поточного елемента масиву. Знову ж таки, якщо елемент за поточним індексом більше, ніж secondBiggest, то привласність secondBiggest значення цього елементу. Це буде повторюватися для кожної ітерації і, зрештою, після завершення обходу масиву в циклі ви отримаєте елементи – найбільший і другий за величиною елементи масиву в змінних biggest і secondBiggest відповідно.   public class SixteenthTask { public static void main(String[] args)             {             // ITVDN.com 16 з ТОП 20 тестових завдань на інтерв’ю для Java розробника             int numbersArray[] = { 10, 15, 32, 100, 16, 11, 98, 36, 95, 33 };             int biggest= numbersArray[0];             int secondBiggest = numbersArray[0];             System.out.println("Отриманий масив: ");             for (int i = 0; i < numbersArray.length; i++)             {             System.out.print(numbersArray[i] + "\t");             }             for (int i = 0; i < numbersArray.length; i++)             {             if (numbersArray[i] > biggest)             {                         secondBiggest = biggest;                         biggest = numbersArray[i];             }             else if (numbersArray[i] > secondBiggest && numbersArray[i] != biggest)             {                         secondBiggest = numbersArray[i];             }             }             System.out.println("\nДруге за величиною число:" + secondBiggest);             } }   На екрані отримаємо: Отриманий масив: 10        15        32        100      16        11        98        36        95        33        Друге за величиною число: 98   Q # 17) Напишіть Java-програму для перевірки, чи введене число є числом Армстронга.   Відповідь: Насамперед, нам потрібно зрозуміти, що таке число Армстронга. Число Армстронга – це число, значення якого дорівнює сумі цифр, з яких воно складається, зведених у ступінь, що дорівнює кількості цифр у цьому числі. Як приклад – число 371: 371 = 3 * 3 * 3 + 7 * 7 * 7 + 1 * 1 * 1 = 27 + 343 + 1 = 371 Якщо у вас число чотиризначне: 8208 = 8 * 8 * 8 * 8 + 2 * 2 * 2 * 2 + 0 * 0 * 0 * 0 + 8 * 8 * 8 * 8 = 4096 + 16 + 0 + 4096 = 8208 Виконуючи рішення, спочатку ми оголошуємо цілочисленні змінні tempNumber, x і y. Ми ініціалізували змінну y значенням 0. Потім ми створюємо змінну qurentNumber і присвоюємо їй ціле значення, яке ми збираємося перевірити, чи є воно числом Армстронга (у нашому випадку це 371). Потім ми надали нашій змінній tempNumber те значення, яке зберігається в перевіреній змінній qurentNumber. Далі в циклі while ми змінній a привласнюємо залишок від ділення числа qurentNumber на 10 – і отримаємо число одиниць у початковому числі qurentNumber. Потім ми замінюємо значення змінної qurentNumber на результат діленого введеного числа на 10. Нашій змінній y, значення якої спочатку було встановлено як 0, присвоюється результат y + (x * x * x). Таким чином під час першої ітерації до y потрапить результат зведення в потрібний ступінь значення числа одиниць у початковому числі, при наступній ітерації до y до ступеня числа одиниць додасться результат зведення в ступінь числа десятків, і так далі по всіх розрядах до кінця числа qurentNumber з права на ліво. Нарешті, ми використовуємо оператор if-else для перевірки, чи буде отримане значення змінної y дорівнювати значення змінної tempNumber (у якій зберігається вихідне число). Якщо y = tempNumber, то загадане число є числом Армстронга, інакше – ні.   public class SeventeenthTask{  public static void main(String[] args)  {             // ITVDN.com 17 з ТОП 20 тестових завдань на інтерв’ю для Java розробника             int y=0, x, tempNumber;             int qurentNumber=371; //Дане число ми перевірятимемо на те, чи є воно числом Армстронга             tempNumber = qurentNumber;             while(qurentNumber >0)             {             x= qurentNumber %10;             qurentNumber = qurentNumber /10;              y=y+(x*x*x);                         }                         if(tempNumber ==y)                         System.out.println("Дане число є числом Армстронга");                          else                         System.out.println("Дане число не є числом Армстронга");     } } На екрані отримаємо: Дане число є числом Армстронга   Q # 18) Напишіть Java-програму для видалення всіх пробілів з рядка за допомогою replace().   Відповідь: Це проста програма, в якій ми маємо рядкову змінну st1. Інша рядкова змінна st2 ініціалізується за допомогою методу replaceAll, який є вбудованим методом для видалення n числа пробілів. У результаті ми виводимо на екран st2, яка вже не містить пробілів. public class EighteenthTask {             public static void main(String[] args)             {             // ITVDN.com 18 з ТОП 20 тестових завдань на інтерв’ю для Java розробника             String st1 = "Ми готуємось   до інтерв’ю   на вакансію     Java розробника";             //Використовуємо метод replaceAll()             String st2 = st1.replaceAll("\\s", "");             System.out.println(st2);             } } На екрані отримаємо: Миготуємосядоінтерв'юнавакансіюJavaрозробника   Q # 19) Напишіть Java-програму для видалення всіх пробілів з рядка без використання replace().   Відповідь: Це ще один підхід до видалення всіх пробілів. Знову ж таки, для початку у нас є одна рядкова змінна st1 з деяким значенням. Ми перетворюємо цей рядок на масив символів, використовуючи toCharArray(). Потім ми маємо один об'єкт StringBuffer strB, який буде використовуватися для додавання значення, що зберігається за індексом chars [i] після того, як ми додали цикл і одну умову if. Умову встановлено так, що елемент з індексом i масиву символів не повинен дорівнювати символу пробілу або табуляції. Зрештою, ми виводимо на екран наш об'єкт StringBuffer strB. public class NineteenthTask {             public static void main(String[] args)             {                         // ITVDN.com 19 з ТОП 20 тестових завдань на інтерв’ю для Java розробника             String st1 = " Ми готуємось  до інтерв’ю   на вакансію     Java розробника";             char[] charsArray = st1.toCharArray();             StringBuffer strB = new StringBuffer();             for (int i = 0; i < charsArray.length; i++)             {             if( (charsArray[i] != ' ') && (charsArray [i] != '\t') )             {                         strB.append(charsArray [i]);             }             }             System.out.println(strB);                      } } На екрані отримаємо: Миготуємосядоінтерв'юнавакансіюJavaрозробника   Q # 20) Напишіть Java-програму для читання даних із таблиці Excel.   Відповідь: Ці типи програм зазвичай використовують у рамках Selenium framework. Ми додали докладні коментарі для кожного кроку, щоб зробити програму більш зрозумілою. Логіка починається з того моменту, як ми завантажили лист, на якому зберігаються дані. Ми намагаємося імпортувати електронну пошту та пароль. Для цього ми виймаємо комірку за допомогою методів getRow() та getCell(). Припустимо, у нас є електронна пошта та паролі в 1-й та 2-й комірці. Далі ми встановлюємо тип комірки – рядкова. Після цього ми виконуємо звичайну операцію локатора веб-елемента (By.id), куди ми передали унікальні значення локатора, такі як "email" та "пароль", які ідентифікуватимуть ці елементи. Нарешті, ми надсилаємо ключі, використовуючи element.sendKeys, де cell.getStringCellValue() – це ключ. Ця операція поверне вам значення, збережене в комірках № 1 і 2 відповідно. @Test  public void ReadData() throws IOException  {            // Імпортуйте лист Excel з директорії web диску c.              //QurentSourceFile – це ім’я потрібного файлу excel              File sourceFile=new File("C:\\web\\QurentSourceFile.xls");              // На цьому кроці ми завантажуємо файл. Ми використовуємо FileInputStream для читання з // файлу Excel. Якщо ви хочете проводити запис у файл – // ви повинні використовувати FileOutputStream. Шлях до файлу передається // в якості аргументу FileInputStream              FileInputStream fileInput = new FileInputStream(sourceFile);                          // На цьому кроці ми завантажуємо робочу книгу Excel             // за допомогою HSSFWorkbook,             // в який ми передаємо fileInput в якості аргументу             HSSFWorkbook book = HSSFWorkbook(fileInput);             // На цьому кроці ми завантажуємо конкретний лист excel,             // на якому зберігаються дані.             qurentSheet= book.getSheetAt(0);              for(int i=1; i<= qurentSheet.getLastRowNum(); i++)              {             // Import data for Email.             qurentCell = qurentSheet.getRow(i).getCell(1);             qurentCell.setCellType(Cell.CELL_TYPE_STRING);                          driver.findElement(By.id("email")).sendKeys(qurenrCell.getStringCellValue());             // Імпортуємо дані з комірок з паролями             qurentCell = qurentSheet.getRow(i).getCell(2);             qurentCell.setCellType(Cell.CELL_TYPE_STRING);             driver.findElement(By.id("password")).sendKeys(qurenrCell.getStringCellValue());             }   } Резюме У цій статті ми розглянули найпоширеніші тестові завдання для розробників Java з прикладами коду. Ці завдання застосовуються на більшості технічних інтерв'ю Java розробників. Ми розглянули такі прийоми роботи з даними за допомогою Java, як базові маніпуляції з рядками, цілими числами та символами, використання Selenium, читання даних із файлу. Теперь у вас є достатньо інформації про те, як проходити технічний етап інтерв'ю на вакансію Java розробника. Звичайно, вам потрібні будуть інші навички. Вивчення напам'ять рішень 20 завдань може бути головним способом підготуватися до інтерв'ю. Вам слід мати гарний набір теоретичних знань та практичних навичок. З нашого боку портал ITVDN.com готовий запропонувати програму підготовки Java розробника, що включає відео курси як із Java, так і за супутніми технологіями. Також рекомендуємо вам ознайомитись із серією відео «Підготовка до співбесіди в IT компанії. Питання та відповіді. Хитрощі. Трюки» За матеріалами статті.
Огляд конструкторів сайтів – критерії вибору та переваги використання

Автор: Редакция ITVDN

WIX uKit Tilda Weebly Nethouse Какой конструктор подойдет для создания сайта? Конструкторы сайтов представляют собой сервис по самостоятельной разработке интернет страниц. В отличие от CMS они просты в управлении, а также открывают множество возможностей настройки и опций, востребованных в современном онлайн мире. Существенным преимуществом конструкторов является то, что создать сайт с помощью этих сервисов можно, не обладая навыками программирования и знанием кода. Кроме этого, большинство современных конструкторов позволяет использовать их бесплатно, немного ограничивая возможности пользователя. Покупка платных пакетов услуг поможет избавиться от неудобств бесплатного аккаунта и сделать сайт еще более актуальным и удобным для посетителя. WIX Конструктор WIX – это международная платформа для создания современных сайтов любого направления. Для новичков система предложит задействовать искусственный интеллект, который поможет максимально адаптировать страницу под тематику и задачи проекта. Более опытные пользователи смогут всецело оценить возможности визуального редактора (drag & drop editor) и различные функциональные опции конструктора позволяющие значительно увеличить возможности сайтов. Ключевые преимущества сервиса: Большой объем опций в бесплатной версии сайта, Креативные шаблоны для конструирования стильных страниц, Широкий выбор дизайнерских решений под разные виды деятельности, Возможность создания одностраничников, многостраничных сайтов, порталов, блогов, страниц-портфолио, интернет магазинов и т.д., Фирменный магазин приложений, расширяющий возможности оплаты, онлайн консультаций, оптимизации и прочего. Для полноценного коммерческого проекта целесообразно купить платный пакет, выбрав среди 4 предложенных вариантов. В этом случае пользователь получит возможность подключать собственный домен, дополнительное пространство для размещения контента, сможет интегрировать сервисы аналитики поисковых систем. Перед тем как начинать работу с WIX, обратите внимание на следующие моменты: Визуальный редактор конструктора требует опыта в оформлении сайтов, Административная панель достаточно сложная и насыщенная функциями, Стоимость пакетов платного доступа относительно высокая.   uKit Конструктор uKit ориентирован на коммерческие сайты, здесь даже новичок сможет без труда сконструировать бизнес страницу. В течение 15 дней пользователь имеет возможность протестировать сервис, по окончании пробного периода понадобится внести оплату, иначе сайт будет снят с публикации. Те, кто примет решение пользоваться сервисом, получат следующие преимущества: Удобная административная панель для работы с сайтом, Обширные SEO настройки для оптимизации страниц, Адаптивный формат ресурса, который корректно отображается на всех типах устройств.   Сервис направлен в первую очередь на бизнес клиентов, этим объясняется его коммерческая направленность – бесплатная версия конструктора отсутствует. Конструктор предлагает 4 тарифных плана, среди которых можно выбрать вариант, подходящий по наполнению. Для удобства пользователей представлена услуга «Сайт под ключ», которая предполагает изготовление страниц специалистами uKit.   Пользователи отмечают ряд недостатков, присущих этому конструктору: Достаточно дорогие пакеты услуг, Небольшой выбор шаблонов, Сложности в уникализации страниц, придании им индивидуального дизайна.     Tilda Tilda – это модульный конструктор со множеством эффектов, актуальных для стильных сайтов. Модули уже созданы специалистами, пользователь лишь расставляет их согласно задачам будущего сайта.   Конструктор позволяет создавать современные и функциональные сайты, однако, сам сервис в большей степени рассчитан на конструирование продающих страниц. Пользователю доступно около 400 блоков для уникализации своего сайта. Присутствует возможность создавать небольшую онлайн витрину с товарами.   Преимущества конструктора Tilda: Профессиональные качественные элементы конструктора для сборки страниц, Возможность создавать несколько сайтов на одном аккаунте, Современный дизайн и функциональность готового продукта, Интеграция с сервисами аналитики, CRM, социальными сетями, Встроенные инструменты для работы с онлайн витриной.   Доступно два платных пакета и один бесплатный. Последний имеет множество ограничений, поэтому покупка расширенного пакета опций необходима для нормального функционирования проекта.   Пользователи конструктора сталкиваются с неудобствами, связанными с использованием сайта на этой платформе: Высокая стоимость предоплаченных пакетов услуг, Однотипность шаблонов, которые выдают происхождение сайта, Сложности в освоении административной панели для начинающих создателей веб-страниц. Weebly Этот сервис позволяет создавать полноценные интернет магазины с информативными карточками товаров, онлайн оплатой, корзиной, фильтрами товаров и т.д. Среди ассортимента шаблонов легко ориентироваться, благодаря фильтрации по цветам и стилям. Выбранный шаблон можно в любой момент поменять на более подходящий.   Преимущества конструктора Weebly: Есть возможность добавить разработанный дизайн в виде кода, Удобная и интуитивная панель управления сайтом, Количество и качество предлагаемых шаблонов, Есть бесплатная версия работы с конструктором с ограниченным функционалом.   Weebly предоставляет возможность управлять сайтом с помощью смартфона или планшета – в магазине приложений можно установить официальную программу. Важно взвесить и особенности сервиса, оцените, насколько для вас критично: Высокая цена за пакет для запуска интернет магазина, стоимость использования конструктора достигает 300 долларов в год, Отсутствие интеграции с социальными сетями ВКонтакте и Одноклассники, Комиссия в 3% за онлайн платежи с сайта. Nethouse Конструктор Nethouse позволяет создавать любые форматы современных сайтов от одностраничников до полноценных интернет магазинов.   Платформа ориентирована на простоту настройки сайта, однако, не имеет большого количества предустановленных шаблонов. Существует 5 групп для разделения дизайнерских решений по направленности сайта: Профессиональный, Лендинг, Универсальный, Визитка, Презентационный.   Редактирование дизайна производится установкой и перестановкой функциональных блоков страницы. Можно задать фон и цветовую гамму страниц, изменить их структуру, в остальном шаблон статичен.   Преимущества конструктора Nethouse: Качество и актуальность шаблонов, Возможность добавления виджетов, Гибкие настройки оптимизации страниц, Возможность заказать продвижение специалистами компании.   Бесплатная версия конструктора позволяет интегрировать SSL сертификат и открывает неограниченный хостинг. Платные пакеты снимают ограничения бесплатного сервиса и позволяют добавить необходимый функционал для решения задач.   Пользователи ресурса иногда выделяют следующие моменты при работе с конструктором: Недостаточный выбор шаблонов и ограничения в кастомизации, Перегруженная панель управления сайтом, Небольшое количество функциональных приложений. Какой конструктор подойдет для создания сайта? Выбрать оптимальный конструктор будет легко, исходя из задач, которые стоят перед разработчиком, типа разрабатываемого сайта, бюджета на реализацию проекта, навыков в создании сайтов, опыта использования того или иного конструктора и личных предпочтений в интерфейсе сервиса. Мы рассмотрели лишь некоторые из популярных конструкторов сайтов – но в действительности их намного больше. Проверьте этот обзор, если желаете протестировать больше конструкторов сайтов.
Junior Java Developer – питання на співбесіді

Автор: Армен Маїлян

В этой статье мы рассмотрим 25 наиболее часто встречающихся вопросов на интервью для новичков в программировании на Java. Все это реальные вопросы на собеседовании Java Junior Developer.   Можно ли в Java переопределить статический метод? Нет, статический метод в Java мы не можем переопределить. Мы можем только скрыть его. В Java статические методы - это те методы, которые можно вызывать без создания экземпляра класса. С другой стороны, если подкласс имеет ту же сигнатуру метода, что и базовый класс - это будет переопределением метода. Статический метод в Java не может быть переопределен по таким причинам: Статические методы - это те, которые принадлежат непосредственно классу. Они не принадлежат объекту, и при переопределении объект решает, какой метод должен быть вызван. Переопределение метода происходит динамически (во время выполнения), это означает, что определение того, какая версия метода будет использоваться происходит во время выполнения в соответствии с объектом, используемым для вызова, в то время как статические методы ищутся статически (во время компиляции). Когда вы запустите программу выше, вы получите следующий результат: Hello...Good morning Hello...Good morning Hello...everyone Согласно правилам переопределения методов, вызов метода разрешается во время выполнения по типу object. Таким образом, в нашем примере выше d.hello (), во втором вызове, должен вызывать метод hello () класса DisplayMessage, поскольку ссылочная переменная класса Display ссылается на объект DisplayMessage, но вызывает hello () самого класса Display. Это происходит потому, что выполнение статического метода разрешается во время компиляции. Таким образом, если статический метод у производного класса имеет ту же сигнатуру, что и статический метод базового класса, это будет называться сокрытием метода, а не переопределением метода. Можно ли выполнить перегрузку метода main() в Java? Достаточно распространенный по языку Java вопрос на интервью. Да, вы можете перегрузить метод main() в Java. В Java можно выполнить перегрузку метода main(), но когда мы запустим нашу программу, JVM будет искать общедоступный статический void main (String [] args) и выполнит этот метод. Перегрузка метода main() в Java: Когда вы запустите программу выше, вы получите такой результат: Inside main(String[] args) Видно, что метод main() у нас перегружен, но все же JVM вызывает метод с подписью public static void main (String [] args). Обратите внимание, что JVM считает var args public static void main (String... args) таким же, как public static void main (String [] args). Если мы хотим вызвать именно перегруженный метод, то вам нужно вызвать его из метода main с сигнатурой public static void main (String [] args). Например: Когда вы запустите программу выше, вы получите такой результат: Inside main(String[] args) Inside main(Integer args) Inside main(Integer arr) Как видите, мы вызвали перегруженные методы из main() с помощью аргумента String []. Можем ли мы в Java переопределить приватные методы? В Java мы не можем переопределить private методы, так как они видны только классу-владельцу. Каков базовый класс для всех классов в Java? java.lang.Object - это базовый класс для всех объектов. Можете ли вы перечислить некоторые важные методы из класса object? Среди важных методов класса object выделяют: hashcode - в качестве возвращаемого значения имеет хеш-значение объекта; equals - сравнивает ссылки на объекты; wait -  текущий поток ожидает, пока не будет вызвано notify или notifyAll; notify - пробуждает один поток, который ожидает блокировки; notifyAll - пробуждает все потоки, ожидающие блокировки; toString - обеспечивает представление объекта в виде строкового значения; clone - этот метод применяется для клонирования объекта; finalize - этот метод вызывается, когда объект подвергается обработке сборщиком мусора. Какие два метода вам нужно переопределить при помещении пользовательского объекта в качестве ключа для HashMap? Вам нужно будет переопределить методы hashcode() и equals() в пользовательском классе, помещая объекты пользовательского класса в HashMap.   В чем отличия в Java между HashMap и HashSet? HashMap В HashMap реализован интерфейс Map, который выполняет сопоставление некого ключа со значением. Он не синхронизирован и не является потокобезопасным. Не допускаются дублирующиеся ключи, а также null ключи и null значения. HashSet В HashSet реализован интерфейс Set, не допускающий дублирования значений. Он не синхронизирован и не является потокобезопасным. Выше employeeSet будет иметь 2 элемента, так как Set не допускает повторяющихся значений. Метод add применяется для добавления элементов в HashSet. Если этот метод возвращает true, тогда элемент добавляется успешно, но, если возвращается false – это значит, что вы пытаетесь вставить дублирующее значение. public boolean add(Object o) Одна из главных особенностей HashSet - объекты, которые мы собираемся добавить в HashSet, должны реализовывать методы Hashcode() и equals(), чтобы мы могли проверять наличие дублирующихся значений. Если мы добавляем пользовательские объекты в HashSet, то мы должны переопределить методы Hashcode() и equals() в соответствии с нашими потребностями. Если HashMap и HashSet не будут переопределены, объект будет принимать реализацию по умолчанию, что может быть нежелательно. HashMap vs HashSet:   Можем ли мы иметь абстрактный класс без какого-либо абстрактного метода в нем? Да, вы можете иметь абстрактный класс без создания какого-либо абстрактного метода.   Что вы знаете о переменной с модификатором transient? Когда вы будете ее использовать? Переменные с модификатором transient (нерезидент) применяются при сериализации. Если вы не хотите делать сериализуемую переменную, вы можете сделать ее переменной с модификатором transient. Transient переменная - это переменная, значение которой не будет сериализоваться во время сериализации объекта. А при десериализации - вы получите значение по умолчанию для этих переменных. Допустим, у вас есть класс Country, и вы не хотите сериализовать атрибут населения, поскольку он будет меняться со временем, поэтому вы можете объявить атрибут населения как transient, и он больше не будет сериализован.   Можете ли вы вызвать метод start() дважды в Java? Нет, вы не можете вызвать метод start() дважды. Это вызовет llegalStateException. После того как поток был запущен, он не может быть запущен снова. Если вы попытаетесь снова запустить поток, он выдаст исключение IllegalThreadStateException Давайте разберемся с помощью примера: Когда вы запустите программу выше, вы получите такой результат: Thread is runningException in thread "main" java.lang.IllegalThreadStateException at java.lang.Thread.start(Thread.java:705) at org.arpit.java2blog.StartThreadAgainMain.main(StartThreadAgainMain.java:16) Как вы можете видеть, когда мы пытались запустить поток во второй раз, он вызывал исключение IllegalThreadStateException. Если вы попытаетесь снова запустить поток, он выдаст исключение IllegalThreadStateException   Почему String неизменяемый (immutable) в Java? В Java класс String неизменяемый. Если вы возьмете словарное значение слова «immutable», это означает, что он не может быть изменен с течением времени, соответственно строка не может быть изменена в Java. Давайте разберемся с примером. Как видите, значение str1 не изменилось. Она создала другой объект String со значением «Hellojava2blog», но не изменил String str1. Это объясняет, что String является неизменяемым по своей природе. Теперь давайте разберемся, каковы потенциальные причины сделать String неизменной в Java. Пул строк: Если вы просто присваиваете значение String, используя двойные кавычки, это значение сохраняется в области, называемой строковым пулом, и на одну строку могут ссылаться многие ссылочные переменные. Если бы String оказался изменяемым, то это повлияло бы на все ссылающиеся на нее переменные. Потокобезопасность: Неизменяемые объекты по умолчанию являются потокобезопасными, поэтому вам не нужно устанавливать для них синхронизацию, и экземпляр String можно безопасно разделить между несколькими потоками. Безопасность: Если бы String был изменяемым, это могло бы привести к множественным проблемам безопасности. Например, при подключении к базе данных вы предоставляете имя пользователя, пароль, порт и имя хоста и т. д. в виде строки. Если бы строка - была изменяемая, то любой хакер мог бы изменить ссылочное значение, что было бы угрозой безопасности для приложения. Хэш-значение кэша: Когда вы используете String в качестве ключа в HashMap или HashSet или любой другой коллекции, вы можете кэшировать ее хеш-значение. Поскольку String является неизменяемым по своей природе, вам не нужно пересчитывать хэш каждый раз, поскольку он будет постоянным. Это значительно повышает производительность для этой коллекции на основе хеша. Загрузка классов: Строка используется в механизме загрузки классов. Она передается в качестве параметра. Если бы строка оказалась изменяемой, это вызвало бы прямую угрозу безопасности, поскольку любой хакер мог бы ее изменить.   Знаете ли вы, как сделать класс неизменным (immutable)? Можете ли вы предоставить шаги для этого? Неизменяемый класс - это класс, состояние которого нельзя изменить после создания. Пример: String - лучший пример неизменяемого класса. Создав строку, вы не сможете ее изменить. Неизменяемый класс очень прост для понимания, он имеет только одно состояние. Неизменяемые классы являются потокобезопасными. Это самое большое преимущество неизменяемого класса, потому что, - вам не нужно применять синхронизацию для неизменяемых объектов. Также, неизменяемый класс может быть полезен при помещении объекта неизменяемого класса в HashMap или может использоваться для целей кэширования, поскольку его значение не изменится. Неизменяемые объекты по умолчанию являются потокобезопасными. Шаги для создания неизменяемого класса: Финализируйте свой класс: Если вы финализируете свой класс - ни один класс не сможет его расширить, следовательно, не сможет переопределить методы этого класса. Пометьте все переменные класса модификаторами доступа private и final: Если вы сделаете переменную экземпляра private - ни один внешний класс не сможет получить доступ к переменным экземпляра, и, если вы сделаете их final - вы не сможете их изменить. Скажите «нет» методам-мутаторам: Не создавайте метод set для некоторых переменных класса, тогда не будет возможности явно изменить состояние переменных экземпляра. Выполните клонирование изменяемых объектов при возврате из метода получения: Если вы вернете клон объекта из метода get, то вернется объект. При этом, ваш оригинальный объект останется без изменений.   Можем ли мы иметь статический метод в интерфейсе? Да, у нас может быть статический метод в интерфейсе из Java 8.   Можете ли вы объявить конструктор финальным (final)? Нет, вы не можете объявить конструктор финальным.     В чем разница между StringBuffer и StringBuilder? Что такое Java ClassPath? ClassPath - это переменная окружения, которую виртуальная машина Java (JVM) использует для определения местоположения всех классов, используемых программой. Например: jre / lib / rt.jar имеет все классы Java, и вам также необходимо включить файлы jar или файл классов, которые используются программой.   У вас есть список пользовательских объектов? Как вы можете их отсортировать? Вам необходимо использовать интерфейс Comparable или Comparator для сортировки списка пользовательских объектов.   Что такое модификатор volatile в Java? Если вы пометите любую переменную как volatile, эта переменная будет считываться из основной памяти, а не из кэша  центрального процессора, поэтому каждый поток будет иметь обновленное значение в переменной.   Назовите два разных способа вызвать сборщик мусора? System.gc() или Runtime.getRuntime().gc().   Что такое маркерный интерфейс в Java? Можете ли вы привести несколько примеров маркерного интерфейса? Маркерные интерфейсы - это те интерфейсы, которые не содержат в себе никаких методов и полей. Примерами интерфейсов маркеров являются: Serializable, Cloneable, Remote.   Сколько объектов будет создано ниже: String str1= new String("John"); String str2= new String("John");   Здесь будут созданы три объекта, два в динамической памяти и один в постоянном пуле String.   Можете ли вы провести различие между проверяемым исключением (Checked Exception) и непроверяемым исключением (Unchecked Exceptions)? Что такое исключение? Исключением является нежелательная ситуация или условие при выполнении программы. И если вы неправильно обрабатываете исключение, то это может привести к аварийному завершению программы. Что такое проверяемое исключение? Проверяемые исключения - это те исключения, которые проверяются при компиляции. Если вы не обработаете их, вы получите ошибку компиляции. Используя блок try и catch вы можете поместить код ошибки в блок try и перехватить исключение в блоке catch. Что такое непроверяемое исключение? Непроверяемые исключения - это те исключения, которые не проверяются во время компиляции. Java VM не будет «ругаться», если вы не обработаете такие исключения. Если вы выполните код выше вы получите: Exception in thread "main" java.lang.NullPointerException at org.arpit.java2blog.NullPointerExceptionExample.main(NullPointerExceptionExample.java:7)   В чем разница между ArrayList и LinkedList? Как вы решите, какой из них вам нужно использовать? Один из распространенных вопросов интервью: «В чем разница между ArrayList и LinkedList». Прежде чем мы действительно увидим различия, давайте кратко рассмотрим оба. ArrayList: ArrayList – является реализацией интерфейса List. ArrayList не синхронизирован (поэтому не является потокобезопасным). ArrayList реализован с использованием массива в качестве внутренней структуры данных. Его можно динамически изменять. LinkedList: LinkedList является реализацией интерфейса List и интерфейса Deque. LinkedList не синхронизируется. LinkedList реализован с использованием двусвязного списка в качестве внутренней структуры данных.   Свойство ArrayList LinkedList Внутренняя структура данных Использует динамический массив для хранения элементов внутри. Он использует дважды связанный список для внутреннего хранения элементов. Скорость выполнения Если нам нужно вставить или удалить элемент в ArrayList, это может занять O(n), так как он использует массив, и нам может потребоваться сместить элементы в случае вставки или удаления. Если нам нужно вставить или удалить элемент в связанном списке, это займет O(1), так как он внутренне использует двусвязный список. Поиск В ArrayList поиск выполняется быстрее, т.к. он использует массив, основанный на индексах. Сложность - O(1). Поиск в LinkedList идет медленнее, т.к. он использует двусвязанный список. Сложность равна O(n). Интерфейсы ArrayList реализует только интерфейс List, поэтому его можно использовать только как List. LinkedList реализует интерфейсы List, Deque, поэтому его можно использовать как List, Stack или Queue. Когда использовать ArrayList и LinkedList? Это на самом деле зависит от нашей потребности. Если нам требуется произвести большое количество вставок или удалений, то нам следует использовать LinkedList. Если у нас имеется мало вставок или удалений, но выполняется много поисковых операций, то тогда нам следует использовать ArrayList.   В чем разница между wait и sleep в Java? Один из распространенных вопросов на интервью Java разработчика: «В чем разница между wait и sleep в Java?». Прежде чем мы действительно увидим различия, кратко ознакомимся с обоими.     sleep vs wait:   Вы запустили три потока из основного потока. Вы должны убедиться, что основной поток завершился последним. Как вы это сделаете? Вы можете использовать Java Thread Join() для достижения этого сценария. Без использования метода Join:     Когда вы запускаете программу выше, вы получите следующий результат: Main thread ends here T2 in run method T1 in run method T3 in run method С помощью метода Join: Когда вы запустите программу выше, вы получите следующий результат: T2 in run method T3 in run method T1 in run method Main thread ends here Как видите, основной поток завершается последним в этом сценарии.     Итоги Мы с вами рассмотрели 25 распространенных вопросов на собеседовании на должность Junior Java Developer.  Конечно же, полноценная подготовка к собеседованию Java разработчика должна включать и практическую и теоретическую подготовку. Готовясь к собеседованию, имеет смысл с одной стороны подготовиться, используя различные наборы вопросов и ответов Java собеседований, а с другой стороны  - быть готовым к решению задач на собеседованиях Java. С нашей стороны, ITVDN.com предлагает комплексную программу подготовки Java разработчика, включающую в себя видео курсы по Java и сопутствующим технологиям.  Рекомендуем вам также ознакомиться с серией видео «Подготовка к собеседованию в IT компании. Вопросы и ответы. Хитрости. Трюки.»   По материалам статьи.
Kotlin vs Java: що краще для Android-розробки?

Автор: Виджай Катри

Kotlin – это статически типизированный язык программирования, разработанный компанией JetBrains. Подобно языку Java, Kotlin стал отличным выбором для разработки приложений на Android. Это можно увидеть даже из того факта, что Android Studio поставляется со встроенной поддержкой Kotlin, как и с поддержкой Java. Kotlin против Java Итак, вопрос состоит в том, стоит ли разработчику переходить на Kotlin с Java или нет? Конечно это зависит от предпочтений разработчика. Однако, прежде чем переключаться, важно понять разницу между двумя языками программирования.   Проверяемые исключения Одно из основных различий между Java и Kotlin заключается в том, что в последнем нет условий для проверяемых исключений (checked exception). Следовательно, нет необходимости отлавливать или объявлять какие-либо исключения. Если разработчик, работающий на Java, считает, что использование кода try / catch в коде раздражает, то упущение, сделанное Kotlin, можно считать желанным изменением. Однако противоположностью будет, если разработчик считает, что проверяемые исключения нужны, способствуя восстановлению после ошибок и созданию надежного кода. В этом случае это можно считать для Kotlin плюсом и минусом, в зависимости от подхода к разработке.   Краткость кода Сравнение класса Java с эквивалентным классом Kotlin демонстрирует лаконичность кода Kotlin. Для той же операции, что выполняется в классе Java, класс Kotlin требует меньше кода. Например, конкретный сегмент, где Kotlin может значительно сократить общий объем стандартного кода, - это findViewByIds. Расширения Kotlin в Android позволяют импортировать ссылку на View в файл Activity. Это дает возможность работать с этим представлением, как если бы оно было частью Activity. Это явно можно отнести к плюсам Котлин.   Сопрограммы Процессы, интенсивно загружающие процессор и сетевой ввод-вывод, обычно используют длительные операции. Вызывающий поток блокируется до завершения всей операции. Поскольку Android является однопоточным по умолчанию, пользовательский интерфейс приложения полностью блокируется, как только блокируется основной поток. Традиционное решение этой проблемы в Java - создать фоновый поток для длительной или интенсивной работы. Однако управление несколькими потоками приводит к увеличению сложности, а также к ошибкам в коде. Kotlin также позволяет создавать дополнительные потоки. Тем не менее, есть лучший способ управления интенсивными операциями в Kotlin, известный как сопрограммы или корутины (coroutines). Корутины в Kotlin реализованы без стека, что означает, что они требуют меньшего использования памяти по сравнению с обычными потоками. Корутины могут выполнять длительные и интенсивные задачи, приостанавливая выполнение, не блокируя поток, а затем возобновляя выполнение через некоторое время. Это позволяет создавать неблокирующий асинхронный код, который выглядит в работе как синхронный. Код с использованием корутин не только понятен, но и лаконичен. Более того, корутины позволяют создавать элегантные дополнительные стили асинхронной неблокирующей разработки, такие как async / await. Все это также явно относится к плюсам Котлина.   Классы данных В полноразмерных проектах обычно есть несколько классов, предназначенных исключительно для хранения данных. Хотя эти классы практически не имеют функциональности, разработчику необходимо написать много стандартного кода на Java. Обычно разработчик должен определить конструктор и несколько полей для хранения данных, функции геттеры и сеттеры для каждого из полей, а также функции equals(), hashCode() и toString(). У Kotlin есть очень простой способ создания таких классов. Разработчику достаточно включить только ключевое слово data в определение класса, и все - компилятор сам позаботится обо всем. Такое удобство создания классов, в вопросах для Kotlin «за и против», явно свидетельствует в его пользу.   Функции расширения Kotlin позволяет разработчикам расширять класс новыми функциями с помощью функций расширения. Эти функции, хотя и доступны в других языках программирования, таких как C#, не доступны в Java. Создать функцию расширения легко в Kotlin. Это делается путем добавления префикса к имени класса, который должен быть расширен до имени создаваемой функции. Чтобы вызвать функцию в экземплярах расширенного класса, нужно использовать нотацию «.»   Функции высшего порядка и лямбды Функция высшего порядка - это функция, которая принимает другие функции в качестве параметров или возвращает функцию. Кроме того, функции Kotlin являются функциями первого класса. Это означает, что они могут храниться в структурах данных и переменных, которые могут передаваться в качестве аргументов и возвращаться из других функций более высокого порядка. Все это просто означает, что функции могут работать всеми возможными способами во взаимодействии с другими нефункциональным значениям. Как статически типизированный язык программирования, Kotlin использует ряд функциональных типов для представления функций. Более того, он поставляется с набором специализированных языковых конструкций, таких как лямбда-выражения. Анонимные функции и лямбда-выражения также известны как функциональные литералы. Это функции, которые не объявлены, но передаются как выражения.   Неявные расширяющие преобразования В Котлине нет поддержки неявных расширяющих преобразований для данных. Таким образом, меньшие типы не могут быть преобразованы в большие типы. В то время как Java поддерживает неявные преобразования, Kotlin требует выполнить именно явное преобразование. Ряд разработчиков воспринимает это как минус Котлин.   Встроенные функции Переменные, к которым осуществляется доступ в теле функции, называются замыканиями. Использование функций высшего порядка может существенно увеличить время выполнения вычислений. Каждая функция в Kotlin является объектом, и он захватывает замыкание. И классы, и функторы требуют выделения памяти. Они, наряду с виртуальными вызовами, требуют определенных затрат на время выполнения. Таких дополнительных издержек можно избежать, вставив лямбда-выражения в Kotlin. Одним из таких примеров является функция lock(). В отличие от Kotlin, Java не обеспечивает поддержку встроенных функций. Тем не менее, компилятор Java способен выполнять встраивание с использованием метода final. Это так, потому что методы final не могут быть переопределены подклассами. Кроме того, вызов метода final разрешается во время компиляции. Такие нововведения также воспринимаются как плюсы Котлина.   Встроенная поддержка делегирования В терминологии программирования, Делегирование представляет собой процесс, в котором принимающий объект делегирует свои операции второму объекту делегата. Kotlin поддерживает шаблон проектирования композиция поверх наследования посредством делегирования первого класса, также известный как неявное делегирование. Делегирование в Kotlin является альтернативой наследования. Этот механизм позволяет использовать множественное наследование. Кроме того, делегированные свойства Kotlin предотвращают дублирование кода.   Не-private поля Инкапсуляция необходима в любой программе для достижения желаемого уровня управляемости. Посредством инкапсуляции, представление объекта может быть установлено исходя из того, как вызывающие стороны взаимодействуют с ним. Кроме того, можно изменить представление без необходимости изменения вызывающих абонентов, если публичный API остается неизменным. Неприватные поля или public поля в Java полезны в сценариях, где вызывающие объекты должны меняться в соответствии с их представлением. Это означает, что такие поля предоставляют представление объекта вызывающим объектам. У Kotlin нет не-private полей. Это достаточно интересное отличие при сравнении Kotlin и Java.   Нулевая безопасность Одной из самых заметных проблем для разработчиков, связанных с Java, является NullPointerExceptions. Java позволяет разработчикам присвоить значение null любой переменной. Однако, если они пытаются использовать ссылку на объект с значением null, возникает исключение NullPointerException! В отличие от Java, в Kotlin все типы по умолчанию являются не-nullable. Если разработчики попытаются присвоить или вернуть значение null в коде Kotlin, во время компиляции произойдет сбой. Тем не менее, есть способ обойти этот момент. Чтобы присвоить значение null переменной в Kotlin, необходимо явно пометить эту переменную как nullable. Это делается путем добавления знака вопроса после типа, например: val number: Int? = null Таким образом, в Kotlin нет исключений NullPointerException. Если вы встречаете такое исключение в Kotlin, то, скорее всего, вы либо явно присвоили значение null, либо это связано с каким-то внешним Java-кодом.   Примитивные типы Существует 8 примитивных типов данных, включая char, double, float и int. В отличие от Kotlin, переменные примитивного типа не являются объектами в Java. Это означает, что они не являются объектами, созданными из класса или структуры.   Умные приведения Прежде чем объект может быть приведен в Java, обязательно нужно проверить тип. Это также верно в сценариях, где очевидно нужно приводить объект. В отличие от Java, Kotlin имеет функцию умного приведения, которая автоматически обрабатывает такие избыточные приведения. Вам не нужно выполнять приведение внутри оператора, если он уже проверен оператором is в Kotlin.   Статические Члены В Kotlin нет статических элементов. Однако в языке программирования Java ключевое слово static отражает то, что конкретный член, с которым используется это ключевое слово, принадлежит самому типу, а не экземпляру этого типа. Это просто означает, что один и только один экземпляр этого статического члена создается и используется всеми экземплярами класса.   Поддержка Конструкторов Классы Kotlin, в отличие от классов Java, могут иметь один или несколько вторичных конструкторов, в дополнение к первичному конструктору. Это делается путем включения этих вторичных конструкторов в объявление класса.   Троичный оператор В отличие от Kotlin, Java имеет тернарный оператор. Тернарный оператор в Java работает как базовый оператор if. Он состоит из условия, которое оценивается как истинное или ложное. Кроме того, тернарный оператор в Java имеет два значения. Только одно из них возвращается в зависимости от того, является ли условие истинным или ложным. Синтаксис для тернарного оператора Java: (состояние) ? (значение 1) : (значение 2)   Типы подстановочных знаков В общем коде, ' ?' представляет неизвестный тип. Этот символ известен как подстановочный знак. Существует несколько вариантов использования подстановочного знака, в том числе в качестве типа поля, локальной переменной или параметра. В то время как система типов Java предлагает использовать подстановочные знаки, в Kotlin их нет. Тем не менее, у него есть два других механизма - вариативность на уровне объявления и проекции типов как альтернатива. Этого будет полезно учитывать при переходе с Java на  Kotlin.   Библиотеки обработки аннотаций с Kotlin Помимо предоставления поддержки существующим Java-фреймворкам и библиотекам, Kotlin также предлагает расширенные Java-фреймворки, основанные на обработке аннотаций. Однако применение в Kotlin библиотеки Java, которая использует обработку аннотаций, требует добавления ее в проект Kotlin немного другим способом, чем требуется для библиотеки Java, которая не использует обработку аннотаций. Требуется указать зависимость с помощью плагина kotlin-kapt. После этого необходимо использовать инструмент обработки аннотаций Kotlin вместо annotation Processor.   Все еще в замешательстве? Вот решение - взаимозаменяемость! Очевидно, что некоторые моменты лучше реализованы в Kotlin, в то время как для других - выгодно использовать Java. Для тех, кто не хочет отказываться от любого из двух ведущих языков программирования для разработки под Android, к счастью, есть и другой путь. Независимо от всех различий между двумя языками программирования, они полностью совместимы. И Java, и Kotlin компилируются в байт-код. Это означает, что в вопросах «Kotlin vs Java» не будет однозначного ответа, ведь можно вызывать код Java из Kotlin и наоборот. Эта гибкость имеет два преимущества. Во-первых, это облегчает начало работы с Kotlin, постепенно добавляя код Kotlin в проект Java. Во-вторых, оба языка могут использоваться одновременно в любом проекте разработки приложений для Android.   Подводя итоги Несмотря на значительные плюсы Kotlin, в вопросах разработки общего назначения Java одерживает верх. С другой стороны, все больше разработчиков и организаций внедряют Kotlin для быстрой разработки Android приложений. И Java, и Kotlin имеют свои преимущества друг перед другом. Дискуссия о том, какой из них подходит для разработки лучше, только началась, и вряд ли она закончится в ближайшее время. Вопросы выбора: «почему Java?», «почему Kotlin?» все еще остаются. В любом случае переход с Java на Kotlin не будет болезненным. С нашей стороны, мы хотели бы предложить комплексную программу подготовки Java разработчика, которая включает в себя видео курсы по Java и сопутствующим технологиям. Тем же, кто хочет познакомиться с основами языка Kotlin – ITVDN.com предлагает ознакомиться с курсом Kotlin.   Источник
ТОП-7 популярних IDE для програмування на С++

Автор: Армен Маїлян

Visual Studio Qt Creator CLion Eclipse Xcode Code::Blocks NetBeans   Відмінності між IDE та текстовим редактором Рейтинг IDE для С++ за даними Standard C++ Foundation Рейтинг IDE серед користувачів Reddit Рейтинг IDE для C++ від компанії JetBrains Рейтинг найкращих середовищ розробки для C/C++ IDE від G2 Crowd Висновок У роботі будь-якого сучасного розробника програмного забезпечення є інструменти, які стали практично обов'язковими для щоденного застосування. Якщо говорити про програмування мовою C++, таким інструментом, насамперед, буде звичайно інтегроване середовище розробки або IDE (Integrated Development Environment). Звичайно, досвідчений програміст може обійтися і без використання IDE, але це істотно позначиться на таких моментах, як швидкість розробки, якість коду і, звичайно ж, зручність самого процесу написання цього коду. Сьогодні ми розглянемо ТОП-7 найкращих середовищ програмування на C++. Це найчастіше використовувані інструменти від різних компаній та спільнот.   Відмінності між IDE та текстовим редактором Для початку нагадаємо різницю між текстовим редактором, який використовується для написання програм, і повноцінною IDE. Якщо спростити, текстовий редактор – це програма, за допомогою якої розробник взаємодіє безпосередньо з кодом як з текстом. Використовуючи клавіатуру, за допомогою текстового редактора розробник вводить символи та ключові слова мови програмування, описуючи цими словами якийсь алгоритм, зрозумілий надалі комп'ютеру. Код, написаний на C++ за допомогою текстового редактора коду, потрібно буде відправити на компілювання в іншу програму – компілятор, який не входить до складу текстового редактора. Інтегроване середовище розробки, у свою чергу, є комплексом окремих інструментів розробника, який дозволяє не тільки написати код програми, але й скомпілювати цей код у готовий додаток, провести тестування цієї програми, пошук помилок, рефакторинг та інші дії. До складу сучасних IDE як окремі елементи вже входять: текстовий редактор; компілятор (або інтерпретатор – для інтерпретованих мов програмування); відлагоджувач; система управління версіями; інші інструменти. Сучасні IDE можуть суттєво розширювати свій функціонал завдяки різним плагінам. Варто зазначити, що деякі текстові редактори (наприклад Vim, Visual Studio Code, Emacs), завдяки доступним плагінам, також розширюють свій функціонал, доводячи його до практично IDEшних можливостей. Однак це все ж таки два різних інструменти розробника. Текстовий редактор призначений скоріше для внесення дрібних змін до коду окремих файлів майбутньої програми. IDE, у свою чергу, працює з програмою комплексно, розглядаючи її в цілому як проект або набір проектів, а не як окремі текстові файли з кодом. Звідси й різниця у доступних можливостях цих інструментів.   Рейтинг IDE для С++ за даними Standard C++ Foundation Ознайомимося з даними опитування, проведеного серед 3240 розробників у лютому 2018 року організацією Standard C++ Foundation (Некомерційна організація з Бйорном Страуструпом у якості одного з керівників. Метою організації є підтримка спільноти розробників програмного забезпечення C++). За даними цього опитування, розробники на C++ виділили такі засоби розробки, як найчастіше використовувані: Перше місце серед IDE у Visual Studio з 55.28% розробників, що використовують його, друге у Qt Creator – 24.41% розробників, третє місце у CLion – 14.66%, четверте місце займає Eclipse – 12.78% розробників, п'яте місце у XCode – 12.22% розробників, шосте місце у Android Studio – 5.15%, сьоме у Code::Blocks – 4.85%. Як ми бачимо, багато розробників для роботи використовують текстові редактори з різними розширеннями функцій або без них. До таких входять: Vim – 37.93% розробників, Visual Studio Code – 25.77% розробників, Emacs (технічно, це текстовий редактор з розширеннями функціоналу до IDE) – 13.55%, Sublime – 12.78%.   Рейтинг IDE серед користувачів Reddit За результатами опитування, проведеного серед 1860 учасників наприкінці лютого 2018 року у співтоваристві r/cpp на порталі reddit.com, перше місце також займає Visual Studio – 28.43%:   Серед представників IDE до числа найчастіше використовуваних також увійшли: Qt Creator – 11.64%, CLion – 8.91%, Xcode – 4.05%, Eclipse – 3.98%, Code::Blocks – 2.43%.   Рейтинг IDE для C++ від компанії JetBrains Компанія JetBrains, одна з провідних компаній-творців інструментів для розробників (зокрема творець і власник одного з провідних IDE для C++ – CLion), представила в 2018 році свою статистику інтегрованих середовищ програмування С++, які найчастіше використовуються. За даними цієї статистики, перше місце серед різних середовищ розробки для C++ також отримує Visual Studio, що використовується 32% програмістів. Наступні місця в цьому рейтингу інтегрованих середовищ розробки розподілилися таким чином: друге місце у CLion – 11%, третє місце у Xcode – 5%, четверте місце у Eclipse – 5%, п'яте у QtCreator – 4%, шосте місце у Atom – 3 %, сьоме у NetBeans – 3%. Також корисною буде статистика від тієї ж компанії JetBrains, що показує компілятори, котрі найбільш часто застосовуються в розробці:   Рейтинг найкращих середовищ розробки для C / C++ IDE від G2 Crowd Цікаві дані надає аналітична платформа G2 Crowd. Проаналізувавши частоту використання розробниками різних середовищ розробки на C/C++ та ступінь задоволеності цими інструментами, компанія представила таку інфографіку: З цієї схеми ми все ще спостерігаємо лідирування Visual Studio серед інших середовищ розробки C++. Досить нішевими продуктами виявляються CodeLite та Code::Blocks. Ми розглянули кілька відкритих рейтингів найкращих середовищ програмування C++. Використовуючи вказані дані, ми зробили свій рейтинг найкращих середовищ розробки.   1) Visual Studio Visual Studio посідає перше місце у нашому рейтингу. Це широко відоме повнофункціональне середовище розробки від компанії Microsoft, яке дозволяє працювати з такими платформами, як Windows, Інтернет, хмара та Android. Можливості IDE Visual Studio дозволяють правильно та ефективно писати код, реорганізовувати, аналізувати та виправляти проблеми з кодом. Система IntelliSense передбачає API-інтерфейси в міру їх написання і виконує автоматичне завершення для підвищення швидкості та ефективності розробки. Саме ця IDE дозволяє новачкові найлегше увійти в процес розробки. Офіційний сайт – https://visualstudio.microsoft.com/ru/ Особливості Visual Studio: Свій компілятор – MSVC. Існують версії, що працюють на macOS та Windows. Підтримує такі мови: ASP.NET, Ajax, DHTML, Visual C++, JavaScript, JScript, Visual Basic, Visual C#, Visual F#, XAML та ін. Плюси IDE Visual Studio: Безкоштовно поширюється Visual Studio Community з достатнім набором можливостей. Платні версії можуть надаватися навчальним закладам та студентам безкоштовно. Зручна система розумного автодоповнення. Велика кількість налаштувань середовища розробки під «себе» завдяки вбудованим механізмам і доступним доповненням. Мінуси IDE Visual Studio: Версії Visual Studio Professional та Visual Studio Enterprise є платними. Масштабна IDE, досить вимоглива до заліза. Ряд розробників вважають її надмірною для створення дрібних проектів. Досить невелика швидкість запуску проектів та додатків. Не працює на Linux. Платні версії з розширеним функціоналом розповсюджуються за підпискою: Professional - від 45 $ на місяць, Enterprise - від 250 $ на місяць.   2) Qt Creator Qt Creator – ще одне досить зручне і швидке інтегроване середовище розробки C++, що пропонує цікаві можливості для розробника. Ця кросплатформна IDE має сучасний редактор коду C++, вбудований зручний графічний інтерфейс, дизайнер форм, інструменти навігації та багато іншого. Серед розробників багато хто обирає його за його API та бібліотеки, оскільки вони послідовні, деталізовані, зручні та гарно документовані. Qt Creator поставляється з повним набором інструментів розробника, які призначені для одночасного створення додатків і користувацьких інтерфейсів, а потім для подальшого їх розгортання в різних мобільних ОС і настільних ПК. Часто відзначають простоту та чуйність інтерфейсу. Він включає в себе зручний редактор коду з можливістю підсвічування синтаксису і автозаповненням, можливість створення інтерфейсу користувача використовуючи перетягування, інструмент візуального відлагодження та ін. Офіційний сайт: https://www.qt.io Особливості IDE Qt Creator: Доступні версії під Linux, macOS, Windows. Підтримувані компілятори: GCC / G++; MinGW; Linux ICC; Clang; Nim; QCC; MSVC. Доступні розширення, що дозволяють працювати з такими мовами, як Python, Ruby, Java, PHP та іншими. Плюси IDE Qt Creator: Наявність безкоштовної версії. Інтелектуальна система підказок. Можливість компіляції проектів для різних систем. Мінуси IDE Qt Creator: Платна версія від 459 $ на місяць. Безкоштовна версія має низку обмежень.   3) CLion Clion – це потужне і кросплатформне IDE для C і C++ від компанії JetBrains, яке включає сучасні стандарти C++, libc++ і Boost. Це IDE добре знає коди та спрощує рутину, дозволяючи зосереджуватися на основних речах розробки. Однією з його основних можливостей є рефакторинг, який дозволяє вам перейменовувати символи, зрушувати елементи вгору або вниз за ранжуванням, змінювати сигнатуру функції, а також гарантувати, що її автоматичний рефакторинг правильно генеруватиме необхідні зміни в коді. Інтегрований відлагоджувач аналізує та вирішує проблеми за допомогою дружнього користувацького інтерфейсу IDE з GDB / LLDB в якості бекенду. Більше того, він також віддалено зв'язується з нативними процесами чи відлагодженнями. Офіційний сайт IDE Clion - https://www.jetbrains.com/clion/ Особливості IDE Clion: Лише платні версії IDE. Підтримувані мови C і C++. Доступні версії під Linux, Windows, macOS. Підтримує такі компілятори: GCC / G++; MinGW; MSVC. Плюси IDE Clion: Зручні інструменти для розробки візуальних інтерфейсів. Зручні механізми відлагодження додатків. Можливості розширення функціоналу плагінами. Інструменти пошуку помилок у коді в потоковому режимі. Мінуси IDE Clion: Відсутня безкоштовна версія цього IDE. Річна підписка від 199 $.   4) Eclipse IDE Eclipse, заснована на платформі Eclipse, є однією з провідних IDE для розробників на C++ та C. Eclipse пропонує підтримку розробки проектів та кероване середовище розробки з різними наборами інструментів. Він також підтримує різні інструменти, сортування, навігацію за гіперпосиланнями, редактор коду з функцією підсвічування синтаксису, інструменти візуального відлагодження та багато іншого. Це безкоштовне ПЗ з відкритим вихідним кодом, що працює з усіма основними ОС, включаючи Windows, Mac OS X і Linux. Eclipse може похвалитися зручним інтерфейсом. Особливості IDE Eclipse: Працює на таких ОС: Windows, macOS, Linux. Працює з такими мовами: C, C++, Java, Perl, PHP, Python, Ruby та інші. Працює з такими компіляторами: GCC / G++; MinGW; Cygwin. Плюси IDE Eclipse: Простота як установки, так і застосування. Зручний механізм розроблення графічних інтерфейсів. Інструмент із відкритим вихідним кодом. Розповсюджується безкоштовно. Кросплатформність. Велика кількість доступних модулів розширення – багато розробників відзначають, що можливості модулів цієї IDE значно випереджають такі в інших середовищах розробки. Мінуси IDE Eclipse: Ряд розробників відзначають незручність використання механізмів автодоповнення під час написання коду.   5) Xcode Xcode – це повноцінна IDE, що включає набір інструментів для розробки, створена компанією Apple для написання ПЗ під macOS, iOS, WatchOS і tvOS. Xcode вважається найкращою IDE для Mac, будучи створеною розробниками самої операційної системи. Офіційний сайт IDE Xcode - https://developer.apple.com/xcode/ Особливості IDE Xcode: Працює з такими мовами, як AppleScript, C, C++, Java, Objective-C. Працює лише на macOS. Використовує Apple LLVM та GCC компілятори. Плюси IDE Xcode: Зручні інструменти для створення програмного забезпечення під комплекс платформ Apple. Механізми автодоповнення коду. Зручні інструменти для роботи із графічними інтерфейсами. Мінуси IDE Xcode: На ОС Windows та Linux ця IDE не працює.   6) Code::Blocks Code::Blocks або CodeBlocks – це IDE з відкритим вихідним кодом, що розповсюджується безкоштовно. Code::Blocks написана на C++ з використанням wxWidgets в якості інструментарію GUI. Code::Blocks – це IDE, що розширюється і налаштовується, яка працює на таких платформах, як Windows, Linux і macOS. Різний функціонал може бути доданий до цієї IDE шляхом встановлення або написання плагіну. Наприклад, завдяки таким плагінам доступні функції компіляції та відлагодження. Code::Blocks підтримує додавання різних, як готових, так і користувацьких плагінів. Розробники можуть легко налаштувати цю IDE під свої потреби, і навіть легко переміщатися інтерфейсом вкладок. Спочатку IDE Code::Blocks був створений для роботи з C++, але тепер ви також можете запускати програми на C та Fortran. Офіційний сайт IDE Code::Blocks - http://www.codeblocks.org/ Особливості Code::Blocks: Підтримує роботу з такими компіляторами: MingW / GNU GCC; MSVC++; Clang; Digital Mars; Borland C 5.5; Open Watcom. Повністю написаний C++; Працює на Linux, Mac та Windows; Підтримує такі мови: C, C++, Fortran; Плюси Code::Blocks: Вбудований відлагоджувач. Кросплатформний. Підтримка паралельного збирання. Є відкритим програмним забезпеченням. Повна підтримка точок зупинки. Інтегроване інтелектуальне підсвічування синтаксису. Досить чуйна спільнота. Можливість налаштування IDE розробниками під «себе». Мінуси Code::Blocks: Ця IDE погано підходить для розробки великих проектів.   7) NetBeans NetBeans – це одне з часто використовуваних розробниками інтегроване середовище програмування C++. Спонсорований компанією Oracle, проект IDE NetBeans був переданий у 2016 році до рук фонду Apache. На сьогоднішній день NetBeans поставляється з відкритим вихідним кодом. Написане на Java, це IDE має можливість працювати на всіх системах, які підтримують Java – Windows, Linux, macOS та Solaris. NetBeans IDE виглядає як інтерфейс із функцією перетягування, спільно зі списком шаблонів проектів. Використовувати NetBeans зручно для створення додатків C/C++ як з динамічними, так і зі статичними бібліотеками. Крім того, воно надає великий набір інструментів для програмістів на C/C++. NetBeans має багато плагінів, які можуть розширити можливості програмного забезпечення. Офіційний сайт NetBeans - https://netbeans.apache.org Особливості IDE NetBeans: Знаходиться під управлінням Apache Software Foundation. Підтримує такі мови: Java, HTML, HTML 5, C, C++ та інші. Працює на Windows, Linux, macOS і Solaris. Підтримується робота з такими компіляторами: Oracle Solaris Studio; GCC/G++; CLang / LLVM; Cygwin; MinGW. Плюси IDE NetBeans: Безкоштовне розповсюдження під ліцензією вільного програмного забезпечення. Зручний інтуїтивний інструмент створення графічного інтерфейсу GUI Builder. Велика кількість розширень. Кросплатформність. Інтелектуальне автозавершення коду. Велика спільнота. Мінуси IDE NetBeans: Користувачі відзначають тривалий запуск додатку. Ряд користувачів відзначають незручність роботи з дебагером.   Висновок Існує досить багато інтегрованих середовищ розробки на C++. Для вибору IDE під розробку на C++, як і будь-якого іншого інструмента розробника, справедливий індивідуальний підхід. Відштовхуючись від поточних завдань, базової ОС, мов, необхідних плагінів, вимог команди та інших, суто індивідуальних факторів розробки, вибір вами кращого середовища програмування C++ буде різним. Ми рекомендуємо обирати середовище розробки з нашого ТОП 7. Якщо ж ви хочете конкретну пораду для початківця – під Windows спробуйте почати розробляти із Visual Studio у безкоштовній версії Community. У якості безкоштовного середовища розробки C++ під Linux спробуйте Code::Blocks і NetBeans. Згадуючи вибір найкращого платного середовища розробки C++ для Linux і macOS, ми рекомендуємо спробувати тріальну версію платної IDE – CLion. У будь-якому випадку, якщо ви плануєте розробляти на C++ протягом тривалого часу, вибір головного інструменту навряд чи буде для вас остаточним. Пробуйте різні варіанти та стежте за нововведеннями і змінами. Розробникам-початківцям на C++ ми рекомендуємо ознайомитися з відео курсами ITVDN: C++ для початківців. C++ Essential. C++ Advanced.
Що таке нативні та кросплатформні програми? Плюси і мінуси.

Автор: Армен Маїлян

Что такое нативные приложения? Что из себя представляют кроссплатформенные приложения? Какие инструменты для разработки кроссплатформенных приложений применяют чаще всего? Преимущества и недостатки нативного подхода Преимущества и недостатки кроссплатформенных приложений Вывод Мировая статистика использования смартфонов показывает абсолютное преобладание всего двух мобильных операционных систем. Так, по данным портала statista.com, во втором квартале 2018 OS  Android была установлена на 88% всех используемых смартфонов, а iOs – на 11.9%. Данные портала netmarketshare.com, в свою очередь, показывают на апрель 2019 для OS  Android – 69.63%, а для iOs - 28.50%. По состоянию на март 2019 в Google Play Store находилось более 2 600 000 приложений. В Apple App Store, по данным на июль 2018 – 2 450 220 приложений. В течение последних лет количество доступных приложений растет на сотни тысяч в год. По прогнозам statista – к 2020 году объем рынка мобильных приложений приблизится к 190 млрд $. При таком, постоянно растущем количестве конкурентов, перед разработчиками мобильных приложений встает вопрос - какой подход использовать в разработке, чтобы новые, конкурентоспособные приложения: разрабатывались быстро; получались качественными и надежными; легко обновлялись и поддерживались; легко задействовали все необходимые возможности платформы. Фактически, рынок заставляет разработчика делать выбор между разработкой кроссплатформенных приложений и разработкой нативных приложений. Рассмотрим детальнее, что представляет из себя каждый из указанных подходов.   Что такое нативные приложения? Нативные приложения (от англ. native - родной) разрабатываются под конкретную аппаратно-программную платформу и пишутся на языках, созданных для данной платформы. И iOs, и Android имеют свои SDK (от англ. software development kit — набор средств разработки) и свой стек технологий, завязанные на определенный язык программирования. Например, родными языками для Android являются Java и Kotlin, для iOS, соответственно - Swift и Objective-C. Нативные приложения создаются специально для запуска на целевой платформе - с поддержкой всех нативных технологий и аппаратных возможностей конкретной платформы.   Что из себя представляют кроссплатформенные приложения? Как следует из названия, кроссплатформенность подразумевает создание приложений, которые могут работать в различных операционных системах. После написания кода приложения его можно развернуть на разных устройствах и платформах, не беспокоясь о проблемах несовместимости. Это универсальный подход, который широко используется для экономии времени и денег на разработку. Часто для этого используются специализированные кроссплатформенные фреймворки. Примером такой разработки является применение фреймворка Xamarin для создания приложений, работающих не только на Windows. Благодаря использованию Mono (опенсорс реализации платформы .Net), проекты, написанные на C#, успешно запускаются на Unix-like системах – iOs, Android, Linux. Какие инструменты для разработки кроссплатформенных приложений применяют чаще всего? Ссылаясь на статистику appfigures.com можно выделить такие инструменты: Как мы видим наиболее часто применяемым инструментом разработки кроссплатформенных мобильных приложений на конец 2017 года был Cordova – 39.89%. Вторым по частоте применения инструментом является Unity – 30.93%. Третьим – Adobe Flash с 10.39%. Следом идут Cocos2D – 9.37%, Xamarin – 4.5%, Appcelerator – 3.79%, Corona – 2.68%, React Native – 1.85%. Итак, стоит ли вам инвестировать в разработку отдельных нативных приложений на несколько платформ сразу, или убивать двух зайцев одним выстрелом, разрабатывая кроссплатформенные приложения? Или может стоит вообще сосредоточиться только на одной платформе и не обращать внимание на другую, пока не достигнут успех среди приложений первой? По данным портала appfigures.com на начало 2018 года количество приложений, присутствующих на обеих популярных платформах, было вполне ощутимым: 450 тысяч приложений на обеих платформах. Это более 28% приложений в Apple App store и 14% в Google Play Store. Это выглядит достаточно весомой частью, чтобы задуматься об присутствии на обеих платформах и попытке экономии используя кроссплатформенную разработку. По данным того же портала, многие уже существующие приложения расширяют свой рынок, выходя, со временем, на другой платформе. При че чаще приложения выходят дополнительно на Android, выпускаясь изначально под iOs. Можно также наблюдать тенденцию к снижению процента кроссплатформенных приложений за 2016 – 2017 годы. Так стоит ли потратить деньги на разработку двух нативных приложений, идеально соответствующих каждой платформе, или есть смысл сэкономить ресурсы и получить одно – кроссплатформенное? Давайте рассмотрим плюсы и минусы каждого из указанных подходов.   Преимущества и недостатки нативного подхода Плюсы нативных приложений Высокая производительность Поскольку технологии, используемые при разработке платформозависимых приложений, напрямую связаны с этой платформой, собственный нативный код имеет прямой доступ ко всем функциям операционной системы. Это, более простое взаимодействие приложения с собственными функциями мобильных устройств, повышает общую производительность приложения, особенно при представлении графического или мультимедийного контента. Следовательно, создание нагруженных приложений с использованием нативного кода может снизить время отклика,  вероятность сбоев и зависаний. Максимальное использование возможностей платформы Нативные приложения задумываются и разрабатываются, чтобы решать конкретные задачи на конкретной платформе. Это приводит к лучшему соответствию возможностей приложений аппаратным возможностям устройств, включая Bluetooth, NFC, камеру, GPS и т. д. Эта соответствие необходимо, когда приложение должно использовать такие данные, как физическое и географическое местоположение и др. Лучший пользовательский интерфейс Поскольку нативные приложения напрямую интегрируются с мобильной операционной системой, воспринимая и используя все доступные возможности «железа», пользователи могут перемещаться по привычному интерфейсу без особых хлопот, что приводит к положительному пользовательскому опыту (UX) и стабильному повторному использованию. К примеру сейчас, при большом количестве разнообразных вариантов разрешений экранов смартфонов очень важно иметь приложение, оптимизированное под такой экран, чтобы пользователю было удобно этим приложением пользоваться. Лучшее позиционирование в магазинах приложений Качество пользовательского опыта является важным рейтинговым показателем в магазинах приложений. Если приложение имеет высокую оценку пользовательского опыта, оно будет более высоко оценено магазином приложений, что ведет к большему числу рекомендаций для разной аудитории и увеличению доходов от приложения, соответственно. Есть предположение, что в магазинах приложений сами механизмы ранжирования будут лучше представлять приложения именно нативные для платформы, из-за их заведомо более высокой производительности и простоты использования. Минусы разработки нативных приложений Дороговизна и затраты времени на разработку Без сомнения, создание отдельных приложений сразу под каждую из нескольких операционных систем может значительно продлить процесс разработки. Один и тот же программный код не может быть развернут на разных платформах, и программистам потребуется больше времени для преобразования и перезаписи кода, что увеличивает затраты и время разработки. Если компания хочет для каждой из платформ создавать отдельные приложения, она может оказаться вынуждена нанять дополнительных программистов-специалистов. Например, один разработчик будет сосредоточен на разработке приложений для iOS, а другой - на разработке приложений для Android, что еще больше увеличивает расходы.   Несовместимость с другой мобильной операционной системой Вам придется заранее согласиться с несовместимостью вашего приложения с другими ОС. Когда разрабатывается приложение под конкретную ОС, его разработчики используют язык, специфичный только для этой операционной системы: например, Objective-C или Swift - для iOS, для различных мобильных устройств на базе Android - Kotlin и Java. В этом контексте нативное приложение, которое изначально написано для iOs, не будет совместимо с устройствами на базе Android и наоборот.   Упущенные возможности Разработка приложений, ориентированных только на одну платформу, может привести к упущенным возможностям. Особенно если другие платформы заранее не принимаются во внимание. Заведомое сокращение целевого рынка может привести к потере дохода. Плюсы и минусы кроссплатформенных приложений Как следует из названия, кроссплатформенность влечет за собой создание приложений, которые могут работать в различных операционных системах. После написания кода приложения его можно развернуть на разных устройствах и платформах, не беспокоясь о проблемах несовместимости. Это универсальный подход, который широко используется для экономии времени и денег. Вот некоторые преимущества и недостатки использования кроссплатформенного подхода в разработке мобильных приложений. Плюсы кроссплатформенных приложений   Один код доступен для повторного использования на других платформах Основным преимуществом кроссплатформенной разработки мобильных приложений является тот факт, что один и тот же код может использоваться на разных мобильных платформах. В отличие от разработки нативного приложения, для кроссплатформенного приложения не требуется  использование отдельного технического стека для каждой операционной системы. Повторное использование кода позволяет легко развертывать приложение на другой платформе, так как возможности приложения, реализованные на одной платформе, будут работать и на других платформах.    Разработка кроссплатформенных приложений экономически эффективна Одна команда может реализовать нужную идею сразу на всех платформах, используя единый технологический стек. Это приводит к меньшим затратам ресурсов.   Простое и быстрое развертывание Разработчикам кроссплатформенных приложений не нужно изучать несколько технологических стеков различных платформ перед созданием своих приложений, им нужно хорошо освоить один стек разработки и особенности его применения. Поскольку нет необходимости создавать разные кодовые базы, начальное развертывание на целевых платформах происходит намного быстрее. Кроме того, будущие изменения в приложении могут выполняться одновременно, без внесения индивидуальных изменений на каждой платформе.   Кроссплатформенные приложения покрывают более широкую аудиторию Кроссплатформенные приложения предлагают разработчикам больше возможностей для охвата более широкой аудитории, поскольку такие приложения достигают пользователей всех типов и мобильных устройств, независимо от их операционной системы. Это значительно рентабельнее для бизнеса, чем присутствие только на одной платформе.   Кроссплатформенные приложения допускают одинаковый интерфейс и UX Тогда как производительность важна для любого мобильного приложения, его внешний вид (UI) и ощущения (UX) так же важны. Использование единой общей команды разработчиков и единого кода позволяет компаниям использовать одинаковый внешний вид приложения на всех платформах. То есть один и тот же пользовательский интерфейс и UX будет одинаково выглядеть на всех платформах. Недостатки кроссплатформенной разработки приложений   Кроссплатформенные приложения не являются такими гибкими, как нативные приложения Хотя задачи приложения будут реализовываться на всех платформах, скорее всего вы не сможете адаптировать готовое приложение для использования максимальных возможностей каждой из платформ.Работа с унифицированным стеком технологий не обеспечит такой же гибкости настройки и оптимизации, как применение стека технологий, индивидуального для каждой ОС.   Кроссплатформенные приложения не работают так же хорошо, как нативные приложения Использование одного универсального стека технологий приносит в жертву гибкость. Однако потеря гибкости в разработке будет означать потерю возможности улучшить производительность. Поскольку кроссплатформенные приложения отказываются от некоторой гибкости, эти приложения не будут работать так же хорошо, как нативные приложения.   Возможное несоответствие UI в различных платформах Внешний вид интерфейса приложения и правильная настройка UI для соответствия функционала в обеих системах может доставить проблем. К примеру, у каждой системы имеются свои требования к дизайну элементов UI. В определенных случаях эти требования могут оказаться взаимоисключающими.   Отправка кроссплатформенных приложений в соответствующие Магазины приложений может иметь сложности. Механизм добавления вашего приложения, являющегося кроссплатформенным, в Apple App Store и в Google Play Store будет отличаться. Требования этих магазинов приложений к представленным у них продуктам различны.  Прохождение всех проверок и выполнение всех правил для соответствия обоим магазинам будут вызывать определенные сложности.   Вывод Подведем краткие итоги. Попробуем сузить наш достаточно сложный выбор между нативной разработкой и кроссплатформенной. Обратите внимание на стратегию продвижения приложения и на его предполагаемый функционал. Если вам сразу нужен будет охват большей аудитории и у приложения функционал не является сложным - проще и дешевле воспользоваться кроссплатформенным подходом. Если вашему приложению необходимо использовать специфические особенности платформы, при этом нет необходимости в одновременном присутствии сразу и в Apple App Store, и в Google Play Store – разрабатывайте под выбранную платформу нативное приложение. И если ваши успехи покажут вам, что можно захватывать новый рынок – у вас уже будут средства на разработку под вторую платформу. Другие промежуточные варианты будут компромиссами и могут склонять чашу весов как к нативным, так и к мультиплатформенным решениям.   Используйте выбранный вами подход для построения качественных и полезных приложений.  С нашей стороны можем порекомендовать ряд видеокурсов. Для создания кроссплатформенных игр очень удобным инструментом является Unity и на ITVDN вы найдете серию видео курсов по разработке игр на Unity. Если вы хотите попробовать себя в разработке кроссплатформенных приложений с использованием такого инструмента, как Xamarin, вам могут оказаться полезными такие уроки на портале ITVDN.com, как Xamarin. Легкий старт и Разработка пользовательского графического интерфейса (GUI) на C# под Android (Xamarin). Если вы планируете в дальнейшем разработку нативных приложений под Android, мы рекомендуем начать с таких курсов - Java Starter и Java Essential. Также смотрите на ITVDN видео курсы по специальности Android Developer и iOS Developer.
Огляд основних SQL запитів

Автор: Армен Маїлян

Види SQL запитів Типи SQL запитів за їх видами Створення та налаштування бази даних Приклади простих запитів SQL до баз даних SELECT INSERT UPDATE DELETE DROP Приклади складних запитів до бази даних MS SQL Висновки Кожен сайт в Інтернеті, будь-який проєкт, який обробляє значний обсяг інформації, змушений зберігати цю інформацію у тих чи інших базах даних (БД). Переважна більшість проєктів інформацію зберігають у БД реляційного типу, роблячи записи в різних подобах таблиць. Як внесення нових записів, так і звернення до наявних здійснюється завдяки використанню запитів, що складаються конструкціями SQL (structured query language) – непроцедурної декларативної мови структурованих запитів. У нашому випадку це означає, що, використовуючи конструкції SQL ми будемо звертатися до БД, повідомляючи, що потрібно зробити з даними, але не вказуючи яким саме способом це потрібно зробити. Фактично SQL є набором стандартів для написання запитів до БД. Остання чинна редакція стандартів мови SQL - ISO/IEC 9075:2016. Ґрунтуючись на вказаних стандартах мови SQL, ряд організацій випустили свої розширені версії стандартів зазначеної мови. Подібні версії іноді називають діалектами SQL. Варіанти специфікацій SQL розробляються компаніями та співтовариствами і служать, відповідно, для роботи з різними СУБД (Системами Управління Базами Даних) – системами програм, заточених під роботу з продуктами зі своєї інфраструктури. Найбільш застосовувані сьогодні СУБД, що використовують свої стандарти (розширення) SQL: MySQL — СУБД, що належить компанії Oracle. PostgreSQL — вільна СУБД, що підтримується та розвивається спільнотою. Microsoft SQL Server — СУБД, що належить компанії Microsoft. Застосовує діалект Transact-SQL (T-SQL). Діалекти SQL, які створюються, специфікуються і використовуються різними організаціями, мають як спільні риси, так і ряд відмінностей у можливостях розширень. Загальними рисами діалектів є основні конструкції, які застосовуються практично без відмінностей у багатьох реляційних БД. Основні відмінності діалектів полягають у відмінностях використаних типів даних, кількості, реалізації та детальних можливостей команд. Різні діалекти застосовують як різні набори зарезервованих слів, так і різні набори команд. Тут ми розглядатимемо запити, застосовуючи конструкції зі специфікацій діалекту T-SQL. Торкнемося класифікації SQL запитів. Виділяють такі види SQL запитів: DDL (Data Definition Language) – мова визначення даних. Завданням DDL-запитів є створення БД та опис її структури. Запитами такого виду встановлюються правила того, в якому вигляді різні дані будуть розміщуватися в БД. DML (Data Manipulation Language) – мова маніпулювання даними. До запитів цього типу входять різні команди, використовуючи які безпосередньо здійснюються деякі маніпуляції з даними. DML-запити потрібні для додавання змін до вже внесених даних, для отримання даних з БД, для їх збереження, для оновлення різних записів і для їх видалення з БД. До елементів DML-звернень входить основна частина SQL операторів. DCL (Data Control Language) – мова управління даними. Включає запити та команди, що стосуються дозволів, прав та інших налаштувань СУБД. TCL (Transaction Control Language) – мова управління транзакціями. Конструкції такого типу застосовують для керування змінами, які здійснюються з використанням DML-запитів. Конструкції TCL дозволяють нам проводити об'єднання DML запитів у набори транзакцій.   Основні типи SQL запитів за їх видами: Нижче ми розглянемо практичні приклади застосування SQL запитів для взаємодії з БД, використовуючи запити двох категорій – DDL та DML.   Створення та налаштування бази даних Нам потрібна буде для прикладів БД MS SQL Server 2017 та MS SQL Server Management Studio 2017. Розглянемо послідовність дій того, як створити запит SQL. Скориставшись Management Studio, спочатку створимо новий редактор скриптів. Щоб це зробити, на стандартній панелі інструментів оберемо «Створити запит», або скористаємось клавіатурною комбінацією Ctrl+N. Натискаючи кнопку «Створити запит» у Management Studio, ми відкриваємо тестовий редактор, використовуючи який можна виконувати написання SQL запитів, зберігати їх і запускати. Використовуємо для початку прості запити SQL, завдяки яким можна створити та налаштувати нову БД, щоб отримати можливість надалі з нею працювати. Створимо нову БД з ім'ям “b_library” для бібліотеки книг. Щоб це зробити, наберемо в редакторі такий SQL запит: CREATE DATABASE b_library; Далі виділимо введений текст і натиснемо F5 або кнопку "Виконати". У нас створиться БД "b_library". Усі подальші маніпуляції ми можемо провести із цією створеною нами БД. Для цього спочатку підключимося до цієї бази: USE b_library; У БД "b_library" створимо таблицю авторів "tAuthors" з такими стовпцями: AuthorId, AuthorFirstName, AuthorLastName, AuthorAge: CREATE TABLE tAuthors ( AuthorId                      INT                  IDENTITY (1, 1) NOT NULL, AuthorFirstName        NVARCHAR (20)        NOT NULL, AuthorLastName         NVARCHAR (20)    NOT NULL, AuthorAge                   INT                              NOT NULL ); Заповнимо нашу таблицю такими авторами: Олександр Пушкін, Сергій Єсенін, Джек Лондон, Шота Руставелі та Рабіндранат Тагор. Для цього використовуємо такий SQL запит: INSERT tAuthors VALUES ('Александр', 'Пушкин', '37'), ('Сергей', 'Есенин', '30'), ('Джек', 'Лондон', '40'), ('Шота', 'Руставели', '44'), ('Рабиндранат', 'Тагор', '80'); Ми можемо подивитися в «tAuthors» записи шляхом відправлення до СУБД простого SQL запиту: SELECT * FROM tAuthors; У нашій БД «b_library» ми створили першу таблицю «tAuthors», заповнили «tAuthors» авторами книг і тепер можемо розглянути різні приклади запитів SQL, якими ми зможемо взаємодіяти з БД. Приклади простих запитів SQL до баз даних. Розглянемо основні запити SQL. SELECT 1) Виведемо всі наявні у нас БД: SELECT name, database_id, create_date FROM sys.databases; 2) Виведемо всі таблиці у створеній нами раніше БД «b_library»: SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' 3) Виводимо ще раз наявні у нас записи за авторами книг зі створеної вище «tAuthors»: SELECT * FROM tAuthors; 4) Виведемо інформацію про те, скільки у нас є записів рядків у «tAuthors»: SELECT count(*) FROM tAuthors; 5) Виведемо з «tAuthors» два записи, починаючи з четвертого. Використовуючи ключове слово OFFSET, пропустимо перші три записи, а завдяки використанню ключового слова FETCH – позначимо вибірку наступних 2 рядків (ONLY): SELECT * FROM tAuthors ORDER BY AuthorId OFFSET 3 ROWS    FETCH NEXT 2 ROWS ONLY; 6) Виведемо з «tAuthors» всі записи із сортуванням в алфавітному порядку за першою літерою імені автора: SELECT * FROM tAuthors ORDER BY AuthorFirstName; 7) Виведемо з «tAuthors» дані, попередньо по AuthorId відсортувавши їх за спаданням: SELECT * FROM tAuthors ORDER BY AuthorId DESC; 8) Виберемо записи з "tAuthors", значення AuthorFirstName у яких відповідає імені "Александр": SELECT * FROM tAuthors WHERE AuthorFirstName='Александр'; 9) Виберемо з "tAuthors" записи, де ім'я автора AuthorFirstName починається з "се": SELECT * FROM tAuthors WHERE AuthorFirstName LIKE 'се%'; 10) Виберемо з "tAuthors" записи, в яких ім'я автора (AuthorFirstName) закінчується на "ат": SELECT * FROM tAuthors WHERE AuthorFirstName LIKE '%ат' ORDER BY AuthorId; 11) Зробимо вибірку всіх рядків із «tAuthors», значення AuthorId у яких дорівнює 2 або 4: SELECT * FROM tAuthors WHERE AuthorId IN (2,4); 12) Виберемо в "tAuthors" такий запис AuthorAge, значення якого - найбільше: SELECT max(AuthorAge) FROM tAuthors; 13) Проведемо вибірку з "tAuthors" по стовпцях AuthorFirstName та AuthorLastName: SELECT AuthorFirstName, AuthorLastName FROM tAuthors; 14) Отримаємо з "tAuthors" всі рядки, у яких AuthorId не дорівнює трьом: SELECT AuthorId, AuthorFirstName, AuthorLastName  FROM tAuthors WHERE AuthorId!='3'; INSERT INSERT – це вид запиту SQL, у разі застосування якого СУБД виконує додавання нових записів у БД. Додамо до «tAuthors» нового автора – Вільяма Шекспіра, 51 рік. Відповідно, у полі AuthorFirstName додасться Вільям, в AuthorLastName додасться Шекспір, в AuthorAge – 51. До AuthorId, у нашому випадку, автоматично додасться значення, інкрементоване відносно попереднього на 1. INSERT INTO tAuthors VALUES ('Уильям', 'Шекспир', '51'); Перевіримо: SELECT * FROM tAuthors;   UPDATE UPDATE – SQL запит, який дозволяє внести зміни або дописувати нову інформацію до тих записів, які вже існують. Внесемо коригування до шостого запису (AuthorId = 6). Значення змінимо для полів імені, прізвища та віку автора. UPDATE tAuthors SET AuthorFirstName = 'Лев', AuthorLastName='Толстой', AuthorAge = '82' WHERE AuthorId = '6'; Потім звернімося до БД, щоб вивести всі наявні записи: SELECT * FROM tAuthors; Ми бачимо зміни інформації в записі автора під номером 6. DELETE DELETE – SQL запит, виконуючи який у СУБД проводиться операція видалення певного рядка з таблиці в БД. Звернемося до "tAuthors" з командою на видалення рядка, де AuthorId = 5: DELETE FROM tAuthors WHERE AuthorId = '5'; Щоб побачити зміни, знову звернемося до бази для виведення всіх записів: SELECT * FROM tAuthors; Ми бачимо, що запис автора під номером 5 тепер відсутній у tAuthors і, відповідно, не виводиться з іншими записами. DROP DROP – ключове слово в SQL, яке використовується для видалення даних за допомогою запиту. Наприклад, видалення деякої таблиці з БД. Після розгляду ряду простих запитів до БД ми можемо повністю видалити нашу таблицю tAuthors, виконавши простий SQL запит: DROP TABLE tAuthors;    Далі розглянемо складні запити SQL. Приклади складних запитів до бази даних MS SQL Складні запити SQL представляють собою комбінації простих запитів. Виконуючись, прості запити повертають згруповані в проміжні таблиці набори даних. А складний запит уже маніпулює даними, отриманими завдяки простим «підзапитам». Складні запити отримуються такими способами: Переміщенням одного запиту в інший. В цьому випадку зовнішній вираз називатиметься основним запитом, а вкладений вираз - підзапитом. Застосування з SQL запитами різних операторів об'єднання результатів виконання підзапитів. Такі оператори називають реляційними. Розглянемо у SQL приклади складних запитів. Скористаємося нашою попередньою таблицею tAuthors та створимо додатково ще одну таблицю з книгами цих авторів – tBooks. У якості ідентифікатора авторів книг використовуємо значення AuthorId з "tAuthors", а назва книги - BookTitle. CREATE TABLE tBooks ( BookId             INT                  IDENTITY (1, 1) NOT NULL, BookTitle        NVARCHAR (20)        NOT NULL, Author             INT                     NOT NULL ); Заповнимо «tBooks» такими книгами: INSERT tBooks VALUES ('Руслан и Людмила', '1'), ('Кавказский пленник', '1'), ('Евгений Онегин ', '1'), ('Радуница', '2'), ('Преображение', '2'), ('Мартин Иден', '3'), ('Морской волк', '3'), ('Белый Клык', '3'); 1) Зробимо вибірку з БД усіх книг, у яких ім'я автора – «Александр»: SELECT BookId, BookTitle FROM tBooks WHERE Author = (SELECT AuthorId FROM tAuthors WHERE AuthorFirstName = 'Александр'); Отримаємо: 2) Зробимо вибірку даних із «tBooks» усіх книг, авторами яких є люди з іменами «Александр» або «Сергей»: SELECT BookTitle FROM tBooks WHERE Author = SOME(SELECT AuthorId FROM tAuthors WHERE AuthorFirstName IN ('Александр', 'Сергей')); 3) Зробимо вибірку за книгами з таблиці «tBooks», у яких імена авторів НЕ «Сергій» та НЕ «Олександр»: SELECT * FROM tBooks WHERE Author != ALL(SELECT AuthorId FROM tAuthors WHERE AuthorFirstName IN ('Александр', 'Сергей')); 4) Візьмемо таблицю «tBooks» і зробимо з неї вибірку всіх книг із зазначенням як імен, так і прізвищ авторів цих книг із «tAuthors»: SELECT tBooks.BookId, tBooks.BookTitle, tAuthors.AuthorFirstName, tAuthors.AuthorLastName FROM tBooks JOIN tAuthors ON tAuthors.AuthorId = tBooks.Author; Висновки Ми з вами розглянули декілька варіантів найпростіших і найскладніших SQL запитів. Звичайно цю статтю не варто розглядати ні як навчальний посібник, ні як вичерпний перелік можливостей запитів у T-SQL та інших діалектах. Її швидше за все можна вважати прикладом SQL запитів для початківців. Однак вона може бути для Вас відправною точкою. Існує набагато більше різних SQL запитів. Це і запити з циклічними конструкціями, і рекурсивні, і різна робота зі змінними, і інші види запитів та підзапитів. Якщо Ви хочете вивчити цю дуже важливу специфічну мову складання запитів до БД – можете пройти відповідні курси на нашому порталі ITVDN.com, обравши відповідний Вам діалект: Transact-SQL - https://itvdn.com/ru/video/ssms_tsql SQL Essential - https://itvdn.com/ru/video/sql-essential SQL Практикум - https://itvdn.com/ru/video/sql-workshop MySQL - https://itvdn.com/ru/video/mysql-essential PostgreSQL - https://itvdn.com/ru/video/postgresql
ТОП 10 найкращих HTML редакторів

Автор: Армен Маїлян

Що таке редактор HTML? WYSIWYG редактори Текстові HTML редактори Найкращі HTML редактори Visual Studio Code Notepad++ Sublime Text WebStorm на базі IntelliJ Vim Eclipse Atom Adobe Dreamweaver CC Brackets CoffeeCup HTML редактор HTML-Online  Висновок   Що таке редактор HTML? Якщо спростити відповідь на поставлене запитання, HTML редактор — це програма-інструмент, яка використовується для написання основи веб-сайтів. І, незважаючи на те, що практично будь-який текстовий редактор може використовуватися для створення сайтів, це зовсім не означає, що краще використовувати звичайний текстовий редактор замість спеціально створеного інструменту розробника. Сучасні HTML редактори мають безліч вбудованих механізмів, котрі істотно спрощують роботу з сайтами. Виділення спеціальних синтаксичних конструкцій, перевірка помилок, підказка та вставка часто використовуваних елементів коду HTML, механізми автозаповнення – ці та багато інших механізмів сучасних HTML редакторів щодня полегшують роботу програмістів, верстальників та дизайнерів. Однак редактор HTML — це зовсім не одна програма. Це група програм, кожна з яких має свій функціонал, свої особливості використання, свій набір плюсів та мінусів. Завдання такого інструменту, як HTML редактор, – зменшити витрачені вами зусилля, щоб ваш код залишався функціональним і чистим. Які ж бувають HTML редактори? Класифікуючи їх за функціональним призначенням і можливостями, виділяють: WYSIWYG редактори і текстові редактори HTML.   WYSIWYG редактори WYSIWYG (What You See Is What You Get) – абревіатура редакторів цього типу перекладається як «що бачиш, те й отримаєш». Інша назва таких редакторів – візуальні редактори HTML. Фактично, завдання цього типу редакторів – надати інтерфейс редагування, в якому можна відразу побачити, як виглядатиме реалізація коду на сторінці діючого сайту в браузері. Для найпростішої роботи в редакторі цього типу не потрібне знання HTML. З роботи в такому редакторі простіше стартувати користувачу-початківцю, який не має досвіду написання коду. Такий тип редакторів часто вбудовують у веб-сайти — для спрощення налаштування зовнішнього вигляду сайту за деякими заздалегідь написаними шаблонами або для редагування контенту сайту.   Текстові HTML редактори Власне, як зрозуміло з назви, цей тип HTML редакторів орієнтований безпосередньо на роботу з текстом (кодом). Щоб використовувати такий редактор, вам знадобляться знання як мінімум мови HTML. У процесі використання такого редактора ви не зможете постійно спостерігати готову реалізацію сторінки веб-сайту, що розробляється. Проте застосування текстового редактора дає розробнику значно більше свободи, можливостей оптимізації коду та ін.   Найкращі HTML редактори Ми розглянули, що таке HTML редактор і кілька прикладів того, коли той чи інший тип редакторів можуть використовуватися. Розглянемо декілька популярних продуктів для розроблення, і спробуємо визначити, який текстовий редактор більше підійде для вирішення ваших завдань. Вибір інструменту розроблення – питання смаку. Кожен професійний розробник робить цей вибір, виходячи з власних уподобань, з того, як він працюватиме з HTML редактором. Однак є ряд редакторів коду, яким розробники віддають перевагу найчастіше. Stack Overflow щорічно складає рейтинг інструментів розробників, що використовуються найчастіше. Розглянемо результати цього опитування серед веб-розробників за 2018 рік.       Visual Studio Code   Випущений компанією Microsoft на основі коду Atom, Visual Studio Code має частину функціоналу IDE (Integrated development environment) — інтегрованого середовища розроблення — потужної програми, що містить окрім текстового редактора коду ще ряд механізмів, які дозволяють проводити аналіз коду, запуск його та налагодження. Часто уявляють саме цей інструмент, коли говорять про те, який функціонал повинне мати IDE для веб-розроблення. У багатьох рейтингах безкоштовних HTML редакторів саме Visual Studio Code займає перше місце — розробники надають йому перевагу все частіше і частіше. Так, наприклад, за даними Stack Overflow, цей редактор у 2017 році використовували 24% веб-розробників, а у 2018 році – вже 38,7%. Плюси Visual Studio Code Має значну частину функціоналу IDE. Вбудований потужний механізм автозаповнення IntelliSense. Значна кількість розширень та доповнень. Інтегрований з Git "з коробки". Є вбудований налагоджувач для коду JavaScript, TypeScript, Node.js Відкритий вихідний код додатку. Visual Studio Code розповсюджується безкоштовно. Мінуси Visual Studio Code З мінусів розробники відзначають досить великий час запуску програми. Пошук за проєктами здійснюється відносно повільно.   Notepad ++   Notepad++ – це текстовий редактор, що займає небагато місця в оперативній пам`яті комп`ютера. Він розроблений для комп'ютерів під керуванням Windows. Користувачі Linux можуть використовувати його через Wine. Notepad++, випущений ще в 2003 році, є перевіреним та усталеним інструментом багатьох розробників, будучи зручним текстовим редактором для HTML коду. Цей редактор поширюється як безкоштовне програмне забезпечення, а його репозиторій доступний у GitHub. Notepad++ підтримує сторонні плагіни. Основні переваги Notepad++ Notepad++ є простим, невимогливим до ресурсів інструментом. Є портативна версія. Функціонал програми легко розширюється безліччю плагінів. За бажанням такий плагін можна створити самому. Інтерфейс програми також легко налаштовується. Підтримується робота з великою кількістю вкладок одночасно. Notepad++ є на 100% безкоштовною програмою. Недоліки Notepad++ Переважна більшість користувачів цього текстового редактора HTML коду не знаходять у ньому недоліків. Однак можна відзначити деяку мінімалістичність інтерфейсу, яка не підходить ряду користувачів. Також можна відзначити, що цей редактор не є IDE і не містить у собі його додатковий функціонал. З цієї причини багатьом користувачам доводиться використовувати якесь середовище розробки у якості додаткового інструменту до редактора Notepad++.   Sublime Text     Ще одним прикладом чудового текстового редактора для HTML є Sublime. Ця програма постачається безкоштовно з деякими обмеженнями. Іншими словами — ви можете використовувати Sublime безкоштовно, але вам доведеться купити ліцензію, якщо ви захочете скористатися всіма функціями цього редактора. Sublime пропонує гарну підтримку, забезпечуючи постійний вихід актуальних оновлень. Користувачі можуть додавати плагіни, створені спільнотою, або створювати власні. Для значної частини розробників використання безкоштовної версії Sublime буде цілком достатнім. Якщо вам знадобиться більше можливостей, ви зможете придбати ліцензію пізніше. Плюси Sublime Кросплатформенність. Sublime працює у таких операційних системах, як Windows, macOS та Linux. Sublime є інструментом, що споживає небагато ресурсів системи, тому він її не завантажує. Є портативна версія. Sublime надає тисячі різних доповнень з відкритим вихідним кодом, які створені великою та активною спільнотою. Роздільне редагування. Розробники можуть використовувати кілька моніторів та редагувати різні ділянки коду одночасно. Недоліки Sublime Не весь функціонал доступний користувачеві безкоштовно. Рядом користувачів відзначається незручність роботи з менеджером плагінів. Ряд плагінів сторонніх розробників може працювати некоректно.   WebStorm на базі IntelliJ       WebStorm – дуже зручне середовище для web розроблення. WebStorm було розроблене компанією JetBrains на основі іншого їхнього продукту IDE IntelliJ.   Плюси WebStorm Зручне автодоповнення як коду на HTML, CSS, так і на JavaScript. Перевірка на наявність помилок та зручне налагодження коду забезпечується за допомогою інтеграції з низкою систем відстежування помилок. Вбудована інтеграція з такими системами керування версіями, як GitHub, Git, а також Subversion, Perforce та Mercurial. Гнучкість налаштувань. Досить велика кількість плагінів. Недоліки WebStorm Властива всім IDE повільність у роботі та вимогливість до ресурсів. Відносно складні налаштування. Платна IDE, що розповсюджується за передплатою.   Vim   Vim (скорочення від Vi Improved) – це потужний портативний текстовий редактор з дуже багатою історією – йому вже понад 27 років. Має багатий функціонал з можливістю глибокого налаштування програми під себе. В оригінальному вигляді працює у вікні консолі. Можна використовувати версію із графічним віконним інтерфейсом – Gvim. Варто відзначити, що багато сучасних IDE — для поліпшення процесу розробки — містять емулятор функціональності Vim.   Плюси використання Vim Повноцінна робота в багатьох операційних системах - Windows, Linux, Amiga, Mac OS X, Unix, OpenVMS, OS/2. Глибоке налаштування роботи редактора під себе. Дуже низькі вимоги до ресурсів. І, відповідно, — висока швидкість роботи. Можливість редагування або перегляду файлу на віддаленому сервері через термінал Більше 14 000 доступних пакетів розширень.   Недоліки Vim Один із найскладніших для вивчення інструментів розробки. Високий поріг входження вимагає від користувача значних витрат часу на запам'ятовування його особливостей, команд, плагінів тощо.   Eclipse   Використання програми Eclipse як HTML редактору часто вважається надмірним. Будучи повноцінною та багатофункціональною системою розробки, вона, ймовірно, буде надто складною для написання коду на HTML та CSS. Повноцінно свої можливості Eclipse зможе проявити при розробці складних сайтів, підв'язаних на роботу з кількома базами даних і додатковими механізмами. Часто Eclipse використовують для роботи зі сторінками, написаними на Java, PHP, JavaScript та інших мовах програмування. Плюси Eclipse Повноцінна IDE з усім переліком можливостей потужного інструменту розроблення. Кросплатформенність у роботі з Windows, macOS, Linux. Значна кількість розширень та аддонів, які допомагають гнучко налаштовувати Eclipse під різні завдання. Приналежність Eclipse до вільного програмного забезпечення. Мінуси Eclipse Складність налаштування цієї IDE. Надмірна перевантаженість як для розроблення простих сайтів на HTML та CSS. Велика ресурсоємність.   Atom     Атом – це порівняно новий HTML редактор. Він був випущений у 2014 році командою GitHub, і з того часу, за підтримки спільноти GitHub, значно збільшив свою популярність. Цей текстовий редактор є безкоштовним, з відкритим кодом. Цікаво, що у якості слогану для Atom використовується фраза “найбільш зламаний текстовий редактор 21 століття”, маючи на увазі, що будь-який розробник може робити свій внесок у редагування, розширення, зміну та обмін вихідним кодом програми, а також створювати власні пакети для покращення Atom. Які можливості дає Atom Atom є кросплатформенним додатком і працює в таких операційних системах, як Windows, macOS і Linux. Завдяки розумному механізму автозаповнення Atom допомагає швидше писати код. Особливість інтерфейсу Atom дозволяє розбивати інтерфейс на безліч вікон, щоб ви могли порівнювати та писати код у цих вікнах одночасно. Atom є просунутим текстовим редактором, який отримав можливості IDE завдяки різним плагінам. Підтримує у розробленні такі мови, як: HTML, CSS, JavaScript, Python, XML, PHP, Java, SQL, C# та багато інших. Плюси Atom Для Atom є велика кількість доповнень, плагінів та розширень. Відак, “з коробки” Atom поставляється з 81 вбудованим пакетом, і ви також можете додати до 7500 додаткових встановлюваних пакетів. Ви також можете розробити власний пакет. Наявність великої кількості доповнень дозволяє гнучко налаштовувати інтерфейс редактора. Відкритий вихідний код. Весь редактор Atom розповсюджується безкоштовно, надаючи вихідний код, доступний на GitHub. Відмінна інтеграція з Git та GitHub. Підтримка плагіну Teletype. Цей плагін дозволяє безпосередньо в режимі реального часу писати код спільно з іншими розробниками. Мінуси Atom Atom є досить «ненажерливою» програмою, забираючи на себе відносно великий обсяг оперативної пам'яті. Підтримка тих чи інших мов визначається функціоналом плагінів, написаних різними розробниками, а не єдиною організацією. Розглянемо ще ряд додатків, що часто застосовуються у якості HTML редакторів.   Adobe Dreamweaver CC     Програма Adobe Dreamweaver CC, розроблена та керована технологічним гігантом Adobe Inc., є потужним та універсальним інструментом преміум-класу. Вона обслуговує як back-end, так і front-end розроблення. Як програмне забезпечення із закритим вихідним кодом, Dreamweaver призначений для роботи в екосистемі Adobe. Adobe також надає підтримку, плагіни та функції, щоб ви завжди могли без проблем писати код. Dreamweaver — це один із редакторів, які підтримують як текстові, так і WYSIWYG методи роботи з кодом. Багато користувачів цієї програми вважають Dreamweaver найкращим візуальним редактором коду. Таким чином, ви можете вибирати, чи ви хочете працювати з візуальним поданням сторінки або йти класичним шляхом редагування тексту. Основні переваги Dreamweaver CC. Dreamweaver дозволяє писати код будь-якою з основних мов програмування. Підтримує текстові та WYSIWYG режими редактора. Зручний перегляд. Можливість побачити, як виглядає тег, виділивши його. Повністю інтегрований із програмною екосистемою Adobe. Приголомшлива продуктивність. Підтримка Adobe Inc. Підписка на Dreamweaver дає доступ до ряду хмарних бібліотек, що містять величезний обсяг графіки, стилів, шарів та багато іншого. Недоліки Adobe Dreamweaver CC Основним недоліком цього редактора є ціна та умови розповсюдження. Як і інші продукти компанії Adobe, Dreamweaver CC поширюється лише за умови передплати.   Brackets     Brackets — це програмний продукт Adobe, розроблений спеціально для дизайнерів та фронтенд розробників, котрий побачив світ у 2012 році. Цей молодий текстовий редактор, що розповсюджується, на відміну від Dreamweaver, безкоштовно, не може похвалитися великим вибором плагінів, проте відмінно працює з HTML, CSS і JavaScript – основними мовами фронтенд-розробника. Плюси Brackets Зв'язок із Google Chrome. Основна особливість редактора Brackets, що виділяється багатьма розробниками, — зв'язок із Google Chrome у режимі реального часу. За допомогою цього механізму розробник може відразу після внесеної зміни спостерігати, як усі ці зміни відображатимуться в браузері. Доступність на Windows, macOS, Linux. Brackets визнаний одним із найкращих текстових редакторів під macOS. Широко розвинена система гарячих клавіш. Основною особливістю, яка відрізняє Brackets від інших HTML-редакторів, є функція «Вилучити». Функція вилучення дозволяє витягувати інформацію прямо з PSD — таку як шрифти, кольори та вимірювання, з чистим CSS та без контекстних посилань на код. Мінуси Brackets Невелика кількість розширень порівняно з іншими редакторами на ринку. Відсутність підтримки серверних мов (Python, PHP, Ruby).   CoffeeCup HTML редактор     HTML редактор CoffeeCup представлений на ринку як безкоштовною, так і платною версією. Незважаючи на слабку поширеність у російськомовному сегменті Інтернету, HTML редактор CoffeeCup досить популярний за кордоном. Випущений вперше ще 1996 року, до 2008 року редактор було продано вже числом 30 млн. копій. Плюси CoffeeCup У платній версії є окрім текстового ще й WYSIWYG-редактор. CoffeeCup повністю сумісний із платформами Windows та macOS. Платна версія HTML-редактора CoffeeCup включає в себе бібліотеку тегів, перевірку HTML і CSS, завершення ймовірного коду тощо. Зручне автозаповнення тегів. Недоліки CoffeeCup Значна частина функціоналу та матеріалів бібліотеки представлена ​​лише у платній версії.   HTML-Online     Завершимо наш огляд популярних HTML редакторів зручним інструментом для створення та редагування коду прямо в браузері — HTML-Online. HTML-Online є простим та зручним редактором веб-сторінок. Він, ймовірно, один з найкращих візуальних HTML редакторів серед онлайн сервісів. Завдяки сервісу HTML-Online ви зможете почати писати коди вашого нового сайту прямо в браузері, без необхідності завантажувати та встановлювати відповідну програму. Переваги HTML-Online Є як текстовим, так і візуальним редактором, дозволяючи спостерігати за результатами написання у процесі розробки. Зручна конвертація файлів із формату документів Word у HTML, що дозволяє відразу застосовувати правила HTML розмітки до матеріалів із Word-івських файлів. Вбудована підтримка роботи з документами Excel, PDF та іншими форматами. Простий графічний редактор HTML. Недоліки HTML-Online Основним недоліком онлайн текстових редакторів взагалі і HTML-Online зокрема є необхідність писати код відразу. Якщо ви не напишете проєкт за раз, або у вас перерветься інтернет-з'єднання, то доведеться робити проєкт спочатку. Функціонал онлайн редакторів виглядає бліднішим на тлі можливостей повноцінних додатків.   Висновок У кожного практикуючого розробника є можливість самому вибрати для себе відповідний інструмент-редактор зі своїм функціоналом «з коробки» та доступними плагінами. Ми розглянули ряд редакторів, визнаних більшістю розробників найкращими HTML редакторами. Чи зможемо вибрати серед них найкращий редактор веб-сторінок? На жаль, ні. Як видно, для полегшення роботи фронтенд розробника існує безліч різноманітних додатків, що відрізняються як вбудованим функціоналом та дизайном, доступом до плагінів та додаткових бібліотек, так і порогом входження та доступними платформами, на яких працюють редактори. Ці різноманітні додатки – лише інструменти в руках людини, котрі застосовуються, виходячи з конкретного завдання й особистих смаків. Не так важливо, щоб ви одразу обрали для себе один раз і назавжди зручний текстовий редактор для HTML, як важливо, щоб Ви продовжували писати нові сайти, вчилися новим технологіям та відкривали для себе нові інструменти без припинення навчання.
Нові open source проекти на WPF, Win. Forms, та WinUI

Автор: Редакция ITVDN

Обращение Кевина Галло, корпоративного вице-президента, платформа для разработчиков Windows от 04.12.2018 На Build 2018 я рассказал о нашем подходе, который поможет вам быть более продуктивным при разработке приложений, включая внедрение .NET Core 3.0. Мы также начали разъединять многие части платформы разработки Windows, чтобы вы могли постепенно внедрять технологии. Сегодня на конференции Microsoft Connect (); 2018, специально для поддержки инноваций в пользовательском интерфейсе, мы поделились следующим: 1. В .NET Core 3.0 Preview 1 добавлена ​​поддержка возможности создания клиентских приложений с использованием технологий Windows Presentation Foundation (WPF), Windows Forms и  XAML Islands. 2. Windows Forms, WPF и библиотека пользовательского интерфейса Windows (WinUI) - XAML теперь являются открытым программным обеспечением, так что вы можете экспериментировать, имея желаемую свободу действий.   Доступен .NET Core 3.0 Preview 1 Как Скотт Гатри объявил на конференции Microsoft Connect (); 2018, сейчас доступен первый превью .NET Core 3.0. В этой версии .NET добавлена ​​поддержка создания десктопных приложений Windows с использованием Windows Forms и WPF. Теперь вы сможете: Запустить несколько экземпляров .NET Core 3.0 параллельно на одном компьютере, чтобы можно было обновить приложения Windows Forms и WPF до новой версии .NET без обновления всей ОС. Использовать современные элементы управления и стиль Fluent из библиотеки WinUI XAML с помощью XAML Islands из приложений .NET Core 3.0. Прочтите о .NET Core 3.0 Preview 1, попробуйте превью и отправьте нам свой отзыв. Следующая версия .NET Framework, .NET Framework 4.8, будет включать новые элементы управления, которые используют новейшие браузеры и медиаплееры в Windows 10, и поддерживают новейшие стандарты, а приложения WPF и Windows Forms будут иметь доступ к WinUI через XAML Islands для обеспечения современный внешнего вида и сенсорной поддержки. Блог .NET Team расскажет о различиях и совместимости .NET Core и .NET Framework в будущем.   WPF, Windows Forms и WinUI готовы к вашему вкладу в разработку. Указанные шаги – это продолжение нашего вклада в наш с вами общий процесс создания платформы разработки через открытое программное обеспечение. Три наших популярных фреймворка Windows UX уже ожидают ваших коммитов на GitHub: WPF, Windows Forms и WinUI. Открытие исходного кода этих технологий обеспечит прозрачность взаимоотношений между командой разработчиков и сообществом, поможет демократизировать разработку Windows и позволит сообществу участвовать в этой разработке. Мы с нетерпением ждем вашего участия в разработке. Вы можете начать работу с Windows Forms и WinUI. Из WPF сейчас мы открыли System.Xaml, и в ближайшие месяцы откроем еще больше. Источник
Конфігуруємо API за допомогою Nodejs, GraphQL, MongoDB, Hapi та Swagger

Автор: Indrek Lasn

Разделение фронтенда и бекенда имеет множество преимуществ: Основная причина популярности API – это их универсальность, так как мы можем отправлять данные на любой тип клиента - для веба, мобильных устройств, настольных приложений и так далее. Разделение концепций. Давно ушли в прошлое те времена, когда мы имели одно монолитное приложение, где все компоненты были в куче. Представьте, что у вас есть по-настоящему запутанное приложение. Единственное, что вы можете в таком случае сделать – это нанять опытных разработчиков. Понятное дело, что брать на работу новичков и учить их в рамках конкретной компании гораздо выгоднее, поэтому концепции все же стоит разделять. Таким образом мы можем уменьшить общую сложность приложения, делегируя ответственность на микро-сервисы, и уже каждая команда отвечает за свой микро-сервис. Как было сказано ранее, начинающая команда работает гораздо лучше, если обязанности разбиты (бекенд, фронтенд, девопс и так далее).   Что мы будем делать Здесь мы создадим мощное, гибкое NodeJS-приложение на базе GraphQL API с использованием Swagger-документации и на рельсах MongoDB. Нашим скелетом послужит Hapi.js. Мы рассмотрим все этапы работы с технологией на детальном уровне. В результате мы получим очень мощное GraphQL API с прекрасной документацией. Вишенкой на торте станет интеграция с конечными клиентами (React, Vue, Angular). Предварительные требования Установленный Node.js Базовые знания JavaScript Терминал (любой, лучше на основе bash) Текстовый редактор (любой) MongoDB (для Mac: brew install mongodb) Начнем же! Открываем терминал и создаем проект. Внутри директории проекта мы инициализировали новое Node.js-приложение. Далее необходимо установить Hapi-сервер. Установим зависимости. Здесь мы можем использовать Yarn или NPM. Но перед этим давайте поговорим, что такое Hapi.js и зачем он нам нужен. Hapi.js позволяет писать удобные повторно используемые компоненты вместо продумывания определенной инфраструктуры. Вместо работы с Express мы работаем с Hapi. Если кратко, то Hapi – это просто фреймворк Node.js. Причина выбора именно Hapi достаточно проста: простота и гибкость. Благодаря этому мы создадим наш API в кратчайшие сроки.   Вторая зависимость, которую мы загрузим, это good-ole nodemon. При любых изменениях на стороне сервера Nodemon автоматически перезапускает сервер. Таким образом, скорость разработки увеличивается в разы. Откроем проект через текстовый редактор. Я выбрал Visual Studio Code. Настройка Hapi-сервера незамысловата. Создаем index.js в корневой директории и со следующим содержимым: Нам нужна Hapi-зависимость Во-вторых, мы создаем константу server, что создает новый экземпляр Hapi-сервера – в качестве аргументов мы передаем объект с данными о порте и настройками хоста. И наконец-то, мы создаем асинхронное выражение init. Внутри init мы объявляем другой асинхронный метод, запускающий сервер. Server.start() – и функция init(). Не уверены, что такое async – await? Смотрим это: Так, если мы перейдем по указанному хосту, мы увидим следующее: Что хорошо, так это то, что hapi требует маршрут и обработчик. Детальней об этом позже. Теперь быстро добавляем скрипт для запуска сервера в связке с nodemon. Открываем package.json и редактируем секцию скриптов.   И двигаемся дальше.   Маршрутизация Маршрутизация через Hapi интуитивно понятна. Мы вводим / и здесь мы можем указать три параметра: Путь – path Тип метода – get, post или что-либо еще? – method Обработчик маршрута – handler Внутри метода инициализации мы привязываем новый метод – route с параметрами в списке аргументов. Если мы обновим страницу, мы увидим возвращаемое значение корневого обработчика. Отлично, теперь двигаемся дальше!   Настройка базы данных Теперь нам нужно установить базу данных. Здесь мы будем обходится mongodb в связке с mongoose. Как по мне, создание MongoDB-валидации, приведение типов и так далее малость скучное занятие. Поэтому мы используем mongoose. Заключительный компонент базы данных – это mlab. Вместо запуска mongo на нашем локальном ПК мы используем облачный сервер. Причина выбора именно mlab в его бесплатном тарифе (для прототипирования) и простоты использования. Вообще существует множество альтернатив, так что вы вольны выбирать. Создаем базу данных и создаем пользователя для базы данных. На этом тут все. Подключение mongoose с mlab Откроем index.js и добавим следующие строки. Де-факто, мы просто говорим mongoose, к какой базе мы желаем подключиться. Указывать логин-пароль обязательно. Если вы хотите освежить свои навыки MongoDB, вот отличная серия уроков. Если же все прошло по плану, теперь мы должны увидеть в консоли “connected to database”. Ух! Хорошая работа! Теперь пришло время для небольшого перерыва на кофе. Приступаем к разбору различных вкусностей. Создание моделей С MongoDB мы следуем определенным соглашениям моделей.   Относительно несложная концепция. По сути, мы просто объявляем нашу схему для коллекций. Под коллекциями понимайте таблицы в базе данных. Создадим директорию под названием models. Внутри создадим файл Painting.js. Painting.js будет представлять данные, связанные с картинами. Вот как она выглядит: Нам нужна зависимость mongoose Мы объявляем PaintingSchema при помощи вызова конструктора схем и передачи ему нужных параметров. Обратите внимание на строгую типизацию: name может содержать строку, а techniques – массив строк Экспортируем модели и называем их Painting Получим все рисунки из базы данных Для начала нам нужно импортировать модель Painting в index.js. Прописывание маршрутов В идеале название маршрутов должны отображать смысл их обработчиков. Такие как /api/v1/paintings - /api/v1/paintings/{id} – и так далее. Начнем с маршрутов GET, POST. GET получает все рисунки, а POST создает новые. Обратите внимание, маршрут принимает массив объектов, а не один объект. Так же наши любимые стрелочные функции. Мы создали GET для /api/v1/paintings. Внутри обработчика мы вызываем схему mongoose. Mongoose имеет встроенные методы – весьма полезные, если мы используем find(), возвращающий все картины, так как мы не передаем в виде параметра ни единого условия. Так же для того же пути мы создали POST. Причина этому – следование соглашений REST. Давайте разберем обработчик запроса: помним, что схема Painting использует три поля – name – url – techniques. Здесь мы просто принимаем эти аргументы из запроса и передаем в схему. После передачи аргументов мы вызываем метод save() на новой записи и заносим его в mlab – базу данных. Если мы перейдем по указанному адресу, мы увидим пустой массив. Почему пустой? Да потому что мы еще ничего не добавили! Установите postman, он доступен на всех платформах. После установки откроем его. Слева мы видим опции методов. Меняем на POST. Далее URL. Адрес, по которому мы оправляем запрос. Справа синяя клавиша отправки запроса. Ниже url следующие опции. Кликаем на тело и заполняем поля, как в примере. Отлично. Теперь пробуем еще раз!   Отлично! Но у нас все еще есть, с чем разобраться. GraphQL!   Если кому нужно, вот исходный код. На этом пока что все, до новых встреч! Автор перевода: Евгений Лукашук Оригинал статьи
Notification success